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

use*_*495 69 javascript duplicates

可能重复:
在javascript数组中查找重复值的最简单方法

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

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

['hello','goodbye','hey'] //return false because no duplicates exist
['hello','goodbye','hello'] // return true because duplicates exist
Run Code Online (Sandbox Code Playgroud)

Dom*_*nic 172

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

function hasDuplicates(array) {
    return (new Set(array)).size !== array.length;
}
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

我们使用"哈希表",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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 关于你给出的第一个例子.是不是完全相反的验证?如果你的函数被命名为`hasDuplicates`,那么它应该检查在转换过程中集合的大小是否实际缩小,对吧?因此布尔运算符应该是`!==`而不是`===` (2认同)

小智 19

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

function hasDuplicates(a) {

  const noDups = new Set(a);

  return a.length !== noDups.size;
}
Run Code Online (Sandbox Code Playgroud)


Kor*_*rad 17

ES6 的单线解决方案

const arr1 = ['hello','goodbye','hey'] 
const arr2 = ['hello','goodbye','hello'] 

const hasDuplicates = (arr) => arr.length !== new Set(arr).size;
console.log(hasDuplicates(arr1)) //return false because no duplicates exist
console.log(hasDuplicates(arr2)) //return true because duplicates exist
Run Code Online (Sandbox Code Playgroud)

const s1 = ['hello','goodbye','hey'].some((e, i, arr) => arr.indexOf(e) !== i)
const s2 = ['hello','goodbye','hello'].some((e, i, arr) => arr.indexOf(e) !== i);

console.log(s1) //return false because no duplicates exist
console.log(s2) //return true because duplicates exist
Run Code Online (Sandbox Code Playgroud)

  • **仅供参考** - [`Set`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/size) 有一个 `.size` 属性,所以你不必扩展到数组中即可获得“.length” (4认同)

Koo*_*Inc 5

另一种方法(也适用于数组1 中的对象/数组元素)可能是2

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
Run Code Online (Sandbox Code Playgroud)

也可以看看...

1需要一个支持 JSON 的浏览器,如果不支持,则需要一个JSON 库
2 编辑:函数现在可用于简单检查或返回重复值数组

  • 值得注意的非showstopper问题:1)改变要排序的原始数组;2) 不区分 `null`、`NaN`、`Infinity`、`+Infinity` 和 `-Infinity`;3) 如果对象具有相同的自有属性,则它们被认为是相等的,即使它们具有不同的原型。 (3认同)