How to get unique values in an array

后端 未结 20 1926
情歌与酒
情歌与酒 2020-11-22 14:02

How can I get a list of unique values in an array? Do I always have to use a second array or is there something similar to java\'s hashmap in JavaScript?

I am going

相关标签:
20条回答
  • 2020-11-22 14:37
    Array.prototype.unique = function () {
        var dictionary = {};
        var uniqueValues = [];
        for (var i = 0; i < this.length; i++) {
            if (dictionary[this[i]] == undefined){
                dictionary[this[i]] = i;
                uniqueValues.push(this[i]);
            }
        }
        return uniqueValues; 
    }
    
    0 讨论(0)
  • 2020-11-22 14:38

    Not native in Javascript, but plenty of libraries have this method.

    Underscore.js's _.uniq(array) (link) works quite well (source).

    0 讨论(0)
  • 2020-11-22 14:38

    I have tried this problem in pure JS. I have followed following steps 1. Sort the given array, 2. loop through the sorted array, 3. Verify previous value and next value with current value

    // JS
    var inpArr = [1, 5, 5, 4, 3, 3, 2, 2, 2,2, 100, 100, -1];
    
    //sort the given array
    inpArr.sort(function(a, b){
        return a-b;
    });
    
    var finalArr = [];
    //loop through the inpArr
    for(var i=0; i<inpArr.length; i++){
        //check previous and next value 
      if(inpArr[i-1]!=inpArr[i] && inpArr[i] != inpArr[i+1]){
            finalArr.push(inpArr[i]);
      }
    }
    console.log(finalArr);
    

    Demo

    0 讨论(0)
  • 2020-11-22 14:42

    These days, you can use ES6's Set data type to convert your array to a unique Set. Then, if you need to use array methods, you can turn it back into an Array:

    var arr = ["a", "a", "b"];
    var uniqueSet = new Set(arr); // {"a", "b"}
    var uniqueArr = Array.from(uniqueSet); // ["a", "b"]
    //Then continue to use array methods:
    uniqueArr.join(", "); // "a, b"
    
    0 讨论(0)
  • 2020-11-22 14:45

    You only need vanilla JS to find uniques with Array.some and Array.reduce. With ES2015 syntax it's only 62 characters.

    a.reduce((c, v) => b.some(w => w === v) ? c : c.concat(v)), b)
    

    Array.some and Array.reduce are supported in IE9+ and other browsers. Just change the fat arrow functions for regular functions to support in browsers that don't support ES2015 syntax.

    var a = [1,2,3];
    var b = [4,5,6];
    // .reduce can return a subset or superset
    var uniques = a.reduce(function(c, v){
        // .some stops on the first time the function returns true                
        return (b.some(function(w){ return w === v; }) ?  
          // if there's a match, return the array "c"
          c :     
          // if there's no match, then add to the end and return the entire array                                        
          c.concat(v)}),                                  
      // the second param in .reduce is the starting variable. This is will be "c" the first time it runs.
      b);                                                 
    

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

    0 讨论(0)
  • 2020-11-22 14:46

    I was just thinking if we can use linear search to eliminate the duplicates:

    JavaScript:
    function getUniqueRadios() {
    
    var x=document.getElementById("QnA");
    var ansArray = new Array();
    var prev;
    
    
    for (var i=0;i<x.length;i++)
      {
        // Check for unique radio button group
        if (x.elements[i].type == "radio")
        {
                // For the first element prev will be null, hence push it into array and set the prev var.
                if (prev == null)
                {
                    prev = x.elements[i].name;
                    ansArray.push(x.elements[i].name);
                } else {
                       // We will only push the next radio element if its not identical to previous.
                       if (prev != x.elements[i].name)
                       {
                           prev = x.elements[i].name;
                           ansArray.push(x.elements[i].name);
                       }
                }
        }
    
      }
    
       alert(ansArray);
    

    }

    HTML:

    <body>
    
    <form name="QnA" action="" method='post' ">
    
    <input type="radio"  name="g1" value="ANSTYPE1"> good </input>
    <input type="radio" name="g1" value="ANSTYPE2"> avg </input>
    
    <input type="radio"  name="g2" value="ANSTYPE3"> Type1 </input>
    <input type="radio" name="g2" value="ANSTYPE2"> Type2 </input>
    
    
    <input type="submit" value='SUBMIT' onClick="javascript:getUniqueRadios()"></input>
    
    
    </form>
    </body>
    
    0 讨论(0)
提交回复
热议问题