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

时间:2016-09-06 10:02:35

标签: 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);

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

提前致谢!

9 个答案:

答案 0 :(得分:2)

使用以下

更改您的代码
    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);

答案 1 :(得分:2)

如果我正确理解你的问题,那可以帮到你...... 基本上,您需要进行双重迭代。

&#13;
&#13;
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])
);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

我会使用一个记住已经找到的值的对象......这样的东西应该有效;)

&#13;
&#13;
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));
&#13;
&#13;
&#13;

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

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

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

答案 3 :(得分:0)

你甚至不需要嵌套for循环。

&#13;
&#13;
var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex = "";
for (var a = 1; a < numbers4.length; a++) { //start from second elem since first is never a duplicate
        if (numbers4.lastIndexOf(numbers4[a])> a) {
            firstIndex = a;
            break;
        }
}
console.log(firstIndex); //1
&#13;
&#13;
&#13;

迭代期间你要做的就是检查当前值是否存在于数组中的某个位置。这是通过使用lastIndexOf()检查此值的最后一个索引来完成的。

答案 4 :(得分:0)

你的问题是 - 你有两个循环,只有一个break,你需要突破两者。

为什么不在值匹配时立即返回索引?

var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
function getDuplicate(numbers4)
{
    for (var a = 0; a < numbers4.length; a++) {
        for (var b = a+1; b < numbers4.length; b++) {
            if (numbers4[a] === numbers4[b]){
                return a;
            }
        }
    }
}
console.log(getDuplicate(numbers4 ));

但是,您可以通过保留地图来进一步优化代码

function getDuplicate( numbers )
{
    var map = {};
    for (var a = 0; a < numbers.length; a++) 
    {
        if( map[ numbers[ a ] ] )
        {
          return a;
        }
        map[ numbers[ a ] ] = true;
    }
    return -1;
}

答案 5 :(得分:0)

您可以检查org.apache.axis2.deployment.DeploymentException: The following error occurred during schema generation: Error looking for paramter names in bytecode: unexpected bytes in file at org.apache.axis2.deployment.ServiceBuilder.populateService(ServiceBuilder.java:441) at org.apache.axis2.deployment.repository.util.ArchiveReader.buildServiceGroup(ArchiveReader.java:109) at org.apache.axis2.deployment.repository.util.ArchiveReader.processServiceGroup(ArchiveReader.java:232) at org.apache.axis2.deployment.ServiceDeployer.deploy(ServiceDeployer.java:154) 是否不等于indexOf()并返回值和中断循环

lastIndexOf()

答案 6 :(得分:0)

你的休息;终止b循环,因为if()不使用括号{}。

此外,firstIndex应简单地设置为a或b,具体取决于您是否需要返回重复的首次出现或首次重复。

应该是:

if (numbers4[a] === numbers4[b])
{
            firstIndex = a;
            break;
}

答案 7 :(得分:0)

&#13;
&#13;
var numbers = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3];
var firstIndex;
var len = numbers.length;

for (var i = 0; i < len; i++) {
  var tmpArray = numbers.slice(i + 1, len);
  var index = tmpArray.indexOf(numbers[i]);
  if (index !== -1) {
    firstIndex = index + i + 1;
    break;
  }
}
console.log(firstIndex);
&#13;
&#13;
&#13;

<强>更新

实际上你的逻辑是正确的,但你错过了if condition的大括号,如果条件满足那么它意味着firstIndexa相同

这是带括号的代码,

&#13;
&#13;
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 = a
      break;
    }
  }
}
console.log(firstIndex);
&#13;
&#13;
&#13;

答案 8 :(得分:0)

问题表明阵列中的第一个欺骗必须与它的索引一起找到。所以我返回一个对象,其中i属性是 i ndex,e属性是第一个重复的 e 属性。执行此任务的一种方法是

var numbers4 = [5, 2, 3, 4, 2, 6, 7, 1, 2, 3],
    headDupe = (a,r={}) => (r.e = a.find((n,i) => (r.i = a.indexOf(n), r.i < i)),r);

console.log(headDupe(numbers4));