In Javascript, how do I check if an array has duplicate values? [duplicate]

匿名 (未验证) 提交于 2019-12-03 02:14:01

问题:

Possible Duplicate:
Easiest way to find duplicate values in a javascript array

How do I check if an array has duplicate values?

If some elements in the array are the same, then return true. Otherwise, return false.

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

回答1:

If you have an ES2015 environment (as of this writing: io.js, IE11, Chrome, Firefox, WebKit nightly), then the following will work, and will be fast (viz. O(n)):

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

If you only need string values in the array, the following will work:

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; } 

We use a "hash table" valuesSoFar whose keys are the values we've seen in the array so far. We do a lookup using in to see if that value has been spotted already; if so, we bail out of the loop and return true.


If you need a function that works for more than just string values, the following will work, but isn't as performant; it's O(n2) instead of 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; } 

The difference is simply that we use an array instead of a hash table for valuesSoFar, since JavaScript "hash tables" (i.e. objects) only have string keys. This means we lose the O(1) lookup time of in, instead getting an O(n) lookup time of indexOf.



回答2:

Another approach (also for object/array elements within the array1) could be2:

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 needs a browser that supports JSON, or a JSON library if not.
2edit: function can now be used for simple check or to return an array of duplicate values



回答3:

Well I did a bit of searching around the internet for you and I found this handy link.

Easiest way to find duplicate values in a JavaScript array

You can adapt the sample code that is provided in the above link, courtesy of "swilliams" to your solution.



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!