首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript:如何找到第一个重复值并返回其索引?

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

Stack Overflow用户
提问于 2016-09-06 10:02:35
回答 9查看 13.6K关注 0票数 2

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

代码语言:javascript
运行
复制
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);

控制台打印出1,这很好,因为2是第一次复制,但是当我在数组中更改数字时,循环不工作。你能告诉我这里有什么可以改变吗?

提前感谢!

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2016-09-06 10:07:31

使用以下内容更改代码

代码语言:javascript
运行
复制
    var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
    var firstIndex = "";
   var isMatch=false;
    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]);
                isMatch=true;
                break;
          }
        }
           if (isMatch) {break;}
    }
    console.log(firstIndex);
票数 3
EN

Stack Overflow用户

发布于 2016-09-06 10:26:21

如果我正确理解了你的问题,那会对你有帮助.基本上,您需要进行双重迭代。

代码语言:javascript
运行
复制
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])
);

上面的实现具有O(n2)的缺点,因为在findIndex函数中嵌套了findIndex

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

代码语言:javascript
运行
复制
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'])
);

票数 6
EN

Stack Overflow用户

发布于 2016-09-06 10:08:24

我会用一个对象来记住已经找到的值..。这样的事情应该有效;)

代码语言:javascript
运行
复制
var numbers4 = [5, 2, 3, 4, 4, 6, 7, 1, 2, 3];

function findFirstDuplicateIndex(arr){
  var found = {};
  
  for (var a = 0, aa = arr.length; a < aa ; a++) {
    if (found[arr[a]])
      return found[arr[a]];
  
    found[numbers4[a]] = a
  }
}

console.log(findFirstDuplicateIndex(numbers4));

它非常快,因为您只循环了一次数组。其余的时间,您只访问对象属性或设置对象属性.(如果你有问题,请告诉我;)

但是也许有更快的..。这只是一个想法^^

PS:它也适用于单词,而不仅仅是数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39346182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档