在Javascript数组中查找第一个重复的数字

问题描述 投票:0回答:8

我需要找到前两个数字,并显示如下索引:

var arrWithNumbers = [2,5,5,2,3,5,1,2,4];

所以第一个重复的数字是2所以变量firstIndex应该有值0.我必须使用for循环。

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11];
var firstIndex

for (i = numbers[0]; i <= numbers.length; i++) {
  firstIndex = numbers[0]
  if (numbers[i] == firstIndex) {
    console.log(firstIndex);
    break;
  }
}
javascript arrays
8个回答
2
投票

您可以将Array#indexOf方法与fromIndex参数一起使用。

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11];

// iterate upto the element just before the last
for (var i = 0; i < numbers.length - 1; i++) {
  // check the index of next element
  if (numbers.indexOf(numbers[i], i + 1) > -1) {
    // if element present log data and break the loop
    console.log("index:", i, "value: ", numbers[i]);
    break;
  }
}


UPDATE : Use an object to refer the index of element would make it far better.

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11],
  ref = {};

// iterate over the array
for (var i = 0; i < numbers.length; i++) {
  // check value already defined or not
  if (numbers[i] in ref) {
    // if defined then log data and brek loop
    console.log("index:", ref[numbers[i]], "value: ", numbers[i]);
    break;
  }
  // define the reference of the index
  ref[numbers[i]] = i;
}

1
投票

您可以使用两个for循环检查每个值对每个值。如果找到重复值,则迭代停止。

该提议使用labeled statement来打破外环。

var numbers = [1, 3, 6, 7, 5, 7, 6, 6, 4, 9, 10, 2, 11],
    i, j;

outer: for (i = 0; i < numbers.length - 1; i++) {
    for (j = i + 1; j < numbers.length; j++) {
        if (numbers[i] === numbers[j]) {
            console.log('found', numbers[i], 'at index', i, 'and', j);
            break outer;
        }
    }
} 

0
投票

移动每个项目并查找是否在不同的索引上找到相同的项目,如果是,则重复并将其保存到复制变量和中断循环

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11];
var duplicate = null;
for (var i = 0; i < numbers.length; i++) {
  if (numbers.indexOf(numbers[i]) !== i) {
    duplicate = numbers[i];
    break; // stop cycle 
  }
}
console.log(duplicate);

0
投票

var numbers = [7, 5, 7, 6, 6, 4, 9, 10, 2, 11];
var map = {};
    
for (var i = 0; i < numbers.length; i++) {
   if (map[numbers[i]] !== undefined) {
       console.log(map[numbers[i]]);
       break;
   } else {
       map[numbers[i]] = i;
   }
}

好的,让我们打破这个。我们在这里做的是为它们首次出现的索引创建一个数字映射。因此,当我们遍历数字数组时,我们检查它是否在我们的数字地图中。如果它是我们找到它并在我们的地图中返回该键的值。否则,我们将数字添加为地图中的一个键,该键指向它首次出现的索引。我们使用map的原因是它非常快O(1)所以我们的整体运行时间是O(n),这是你在未排序的数组上执行此操作的最快速度。


0
投票

作为替代方案,你可以使用indexOflastIndexOf,如果值不同,有多次重复,你可以打破循环;

function getFirstDuplicate(arr) {
  for (var i = 0; i < arr.length; i++) {
    if (arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])) 
      return arr[i];
  }
}

var arrWithNumbers = [2, 5, 5, 2, 3, 5, 1, 2, 4];
console.log(getFirstDuplicate(arrWithNumbers))

var numbers = [1, 3, 6, 7, 5, 7, 6, 6, 4, 9, 10, 2, 11]
console.log(getFirstDuplicate(numbers))

0
投票

许多好的答案..人们也可以在功能和效率方面做到这一点,如下所示;

var arr = [2,5,5,2,3,5,1,2,4],
   frei = arr.findIndex((e,i,a) => a.slice(i+1).some(n => e === n)); // first repeating element index
console.log(frei)

如果结果有效,因为.findIndex().some()函数都会在满足条件时终止。


0
投票

我有同样的任务,并提出了这个非常基本的解决方案:

var arr = [7,4,2,4,5,1,6,8,9,4];
var firstIndex = 0;

for(var i = 0; i < arr.length; i++){
  for( var j = i+1; j < arr.length; j++){
    if(arr[i] == arr[j]){
      firstIndex = arr[i];
      break;      
    }

  }
}
console.log(firstIndex);

第一个for循环从数组(第7个)获取第一个元素,然后另一个for循环检查所有其他元素,依此类推。

这里重要的是将第二个循环中的j定义为i + 1,否则,任何元素都会在相同的索引处找到相等的数字,而firstIndex将在完成所有循环后得到最后一个的值。


-1
投票
var addIndex = [7, 5, 2, 3, 4, 5, 7,6, 2];
var firstmatch = [];
for (var i = 0; i < addIndex.length; i++) {

    if ($.inArray(addIndex[i], firstmatch) > -1) {
        return false;
    }
    firstmatch.push(addIndex[i]);
}
© www.soinside.com 2019 - 2024. All rights reserved.