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
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
.
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
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.