在Javascript中,如何检查数组是否具有重复值?

时间:2011-09-11 06:04:07

标签: javascript

  

可能重复:
  Easiest way to find duplicate values in a javascript array

如何检查数组是否有重复值?

如果数组中的某些元素相同,则返回true。否则,返回false。

['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicates exist

6 个答案:

答案 0 :(得分:152)

如果您有ES2015环境(截至撰写本文时:io.js,IE11,Chrome,Firefox,WebKit),那么以下内容将会起作用,并且速度很快(即O(n)):

function hasDuplicates(array) {
    return (new Set(array)).size !== array.length;
}

如果您只需要数组中的字符串值,则以下内容将起作用:

function hasDuplicates(array) {
    var valuesSoFar = Object.create(null);
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (value in valuesSoFar) {
            return true;
        }
        valuesSoFar[value] = true;
    }
    return false;
}

我们使用“哈希表”valuesSoFar,其键是我们到目前为止在数组中看到的值。我们使用in进行查找,以查看是否已发现该值;如果是这样,我们会退出循环并返回true


如果您需要的功能不仅仅适用于字符串值,以下内容将起作用,但效果不佳;它是O(n 2 )而不是O(n)。

function hasDuplicates(array) {
    var valuesSoFar = [];
    for (var i = 0; i < array.length; ++i) {
        var value = array[i];
        if (valuesSoFar.indexOf(value) !== -1) {
            return true;
        }
        valuesSoFar.push(value);
    }
    return false;
}

不同之处在于我们使用数组而不是valuesSoFar的哈希表,因为JavaScript“哈希表”(即对象)只有字符串键。这意味着我们失去了in的O(1)查找时间,而是获得了indexOf的O(n)查找时间。

答案 1 :(得分:3)

另一种方法(也用于数组 1 中的对象/数组元素)可以是 2 :< / p>

function chkDuplicates(arr,justCheck){
  var len = arr.length, tmp = {}, arrtmp = arr.slice(), dupes = [];
  arrtmp.sort();
  while(len--){
   var val = arrtmp[len];
   if (/nul|nan|infini/i.test(String(val))){
     val = String(val);
    }
    if (tmp[JSON.stringify(val)]){
       if (justCheck) {return true;}
       dupes.push(val);
    }
    tmp[JSON.stringify(val)] = true;
  }
  return justCheck ? false : dupes.length ? dupes : null;
}
//usages
chkDuplicates([1,2,3,4,5],true);                           //=> false
chkDuplicates([1,2,3,4,5,9,10,5,1,2],true);                //=> true
chkDuplicates([{a:1,b:2},1,2,3,4,{a:1,b:2},[1,2,3]],true); //=> true
chkDuplicates([null,1,2,3,4,{a:1,b:2},NaN],true);          //=> false
chkDuplicates([1,2,3,4,5,1,2]);                            //=> [1,2]
chkDuplicates([1,2,3,4,5]);                                //=> null

See also...

1 需要支持JSON的浏览器,否则需要JSON library
2 编辑:功能现在可用于简单检查或返回重复值数组

答案 2 :(得分:2)

您可以使用 SET 删除重复项并进行比较,如果将数组复制到集合中,它将删除所有重复项。然后简单地将数组的长度与集合的大小进行比较。

function hasDuplicates(a) {

  const noDups = new Set(a);

  if (a.length !== noDups.size) {
    return true;
  } else {
    return false;
  }
}

答案 3 :(得分:1)

您可以利用 indexOflastIndexOf。如果两个索引不相同,则您有重复。

function containsDuplicates(a) {
  for (let i = 0; i < a.length; i++) {
    if (a.indexOf(a[i]) !== a.lastIndexOf(a[i])) {
      return true
    }
  }
  return false
}

答案 4 :(得分:-2)

function hasAllUniqueChars( s ){ 
    for(let c=0; c<s.length; c++){
        for(let d=c+1; d<s.length; d++){
            if((s[c]==s[d])){
                return false;
            }
        }
    }
    return true;
}

答案 5 :(得分:-4)

我为你做了一些在网上搜索,我找到了这个方便的链接。

Easiest way to find duplicate values in a JavaScript array

您可以调整上述链接中提供的示例代码,由“swilliams”提供给您的解决方案。