如何找到数组中第一个重复项的索引?

时间:2019-05-03 10:01:38

标签: javascript arrays

我需要找到数组中第一个重复编号的索引,并仅使用for循环将其分配给空变量

预先感谢

我尝试了许多逻辑运算符。

var findIndex;
var arrWithNumbers = [2, 4, 5, 2, 6, 5, 1, 2, 4, 8]; //-----> it should give result console.log(findIndex) // 0

var arrWithNumbers = [3, 4, 5, 2, 6, 5, 1, 2, 4, 8]; //-----> it should give result console.log(findIndex) // 1


var arrWithNumbers = [2, 4, 5, 2, 6, 5, 1, 2, 4, 8];
var firstIndex = null;
for (var i = 0; i < arrWithNumbers.length; i++) {
  if (arrWithNumbers[i] === i) {
    firstIndex = arrWithNumbers.indexOf(i);
    break;
  }
}
console.log(firstIndex);

我期望什么:

var arrWithNumbers = [2, 4, 5, 2, 6, 5, 1, 2, 4, 8]; //-----> it should give result console.log(findIndex) // 0

var arrWithNumbers = [3, 4, 5, 2, 6, 5, 1, 2, 4, 8]; //-----> it should give result console.log(findIndex) // 1

//what i have
var arrWithNumbers = [2, 4, 5, 2, 6, 5, 1, 2, 4, 8];
var firstIndex = null;
for (var i = 0; i < arrWithNumbers.length; i++) {
  if (arrWithNumbers[i] === i) {
    firstIndex = arrWithNumbers.indexOf(i);
    break;
  }
}
console.log(firstIndex); // 2

3 个答案:

答案 0 :(得分:1)

一个选择是拥有一个包含所有数字计数的变量,您可以使用reduce

var arrWithNumbers = [2, 4, 5, 2, 6, 5, 1, 2, 4, 8];
var firstIndex = null;
var numberCount = arrWithNumbers.reduce((c, v) => (c[v] = (c[v] || 0) + 1, c), {});


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

console.log(firstIndex);


另一个选择是使用lastIndexOf。如果当前索引与lastIndexOf值不同,则表示它具有重复项并中断了循环。

var arrWithNumbers = [3, 2, 4, 5, 2, 6, 5, 1, 2, 4, 8];
var firstIndex = null;

for (var i = 0; i < arrWithNumbers.length; i++) {
  if (i !== arrWithNumbers.lastIndexOf(arrWithNumbers[i])) {
    firstIndex = i;
    break;
  }
}

console.log(firstIndex);

答案 1 :(得分:1)

您可以为访问的值创建哈希表并存储其索引。然后只需检查是否设置了hash属性并返回索引。

此方法适用于单个循环,并在第一个找到的相同值处早退出。

function findIndex(array) {
    var indices = Object.create(null),
        i, value;

    for (i = 0; i < array.length; i++) {
        value = array[i];
        if (value in indices) return indices[value];
        indices[value] = i;
    }
}

console.log(findIndex([2, 4, 5, 2, 6, 5, 1, 2, 4, 8])); // 0
console.log(findIndex([3, 4, 5, 2, 6, 5, 1, 2, 4, 8])); // 2

答案 2 :(得分:0)

您可以使用嵌套的for循环来检查数组中索引i之后的所有值:

var arrWithNumbers = [2, 4, 5, 2, 6, 5, 1, 2, 4, 8];
var firstIndex = null;
for (var i = 0; i < arrWithNumbers.length; i++) {
  value_i = arrWithNumbers[i]
  // loop through the next items of the array
  for (var j = i+1 ; j < arrWithNumbers.length; j++) {
    if (value_i == arrWithNumbers[j]) {
      firstIndex = i;
      break;
    }
  }
  
  if (firstIndex !== null) {
    // we found our firstIndex, quit the main loop
    break;
  }
  
}

console.log(firstIndex)