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

前端 未结 3 1600
渐次进展
渐次进展 2020-11-28 03:39

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

How do I check if an array has

相关标签:
3条回答
  • 2020-11-28 04:04

    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.

    0 讨论(0)
  • 2020-11-28 04:09

    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.

    0 讨论(0)
  • 2020-11-28 04:23

    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.
    2 edit: function can now be used for simple check or to return an array of duplicate values

    0 讨论(0)
提交回复
热议问题