Javascript:如何找到第一个重复值并返回其索引?

Joa*_*nna 2 javascript arrays

我必须在数组中找到第一个重复值,然后在变量 firstIndex 中返回它的索引。这必须使用 for 循环来完成,它应该在找到第一个重复项后停止。我知道这可能很简单,但我被卡住了。到目前为止,我有这个,但它似乎不起作用:

var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex = "";
for (var a = 0; a < numbers4.length; a++) {
    for (var b = a+1; b < numbers4.length; b++) {
        if (numbers4[a] === numbers4[b])
            firstIndex = numbers4.indexOf(numbers4[a]);
            break;
    }
}
console.log(firstIndex);
Run Code Online (Sandbox Code Playgroud)

控制台打印出 1 这很好,因为 2 首先是重复的,但是当我更改数组中的数字时,循环不起作用。你能建议这里可以改变什么吗?

提前致谢!

Hit*_*nds 6

如果我正确理解您的问题,那应该可以帮助您...基本上,您需要进行两次迭代。

const firstDupeIndex = list => list.findIndex(
  (item, index) => list.lastIndexOf(item) !== index
);

console.log(
  "First Dupe at index:", 
  firstDupeIndex([5, 2, 3, 4, 4, 6, 7, 1, 2, 3])
);
Run Code Online (Sandbox Code Playgroud)


O(n2)由于lastIndexOffindIndex函数内嵌套了 ,上述实现带有 be 的缺点。

更好的解决方案是通过构建字典来索引您的事件,从而将时间复杂度保持O(n)在最坏的情况下。可能不那么整洁,但在大输入下肯定会更有效率。

const firstDupeIndex = (list) => {
  const dict = {};
  
  for (const [index, value] of list.entries()) {
    if (dict.hasOwnProperty(value)) {
      return dict[value];
    }
  
    dict[value] = index;
  }
  
  return -1;
};

console.log(
  "First Dupe at index:", 
  firstDupeIndex(['a', 'b', 'c', 'd', 'e', 'b', 'z', 't', 'c'])
);
Run Code Online (Sandbox Code Playgroud)