Remove duplicate objects from an array using javascript

后端 未结 9 1850
野性不改
野性不改 2020-12-02 21:21

I am trying to figure out an efficient way to remove objects that are duplicates from an array and looking for the most efficient answer. I looked around the internet everyt

相关标签:
9条回答
  • 2020-12-02 21:54

    Below is Henrique Feijo's answer with ample explanation and an example that you can cut and paste:

    Goal: Convert an array of objects that contains duplicate objects (like this one)...

    [
        {
            "id": 10620,
            "name": "Things to Print"
        },
        {
            "id": 10620,
            "name": "Things to Print"
        },
        {
            "id": 4334,
            "name": "Interesting"
        }
    ]
    

    ... Into an array of objects without duplicate objects (like this one):

    [
        {
            "id": 10620,
            "name": "Things to Print"
        },
        {
            "id": 4334,
            "name": "Interesting"
        }
    ]
    

    Explanation provided in the comments:

        var allContent = [{
          "id": 10620,
          "name": "Things to Print"
        }, {
          "id": 10620,
          "name": "Things to Print"
        }, {
          "id": 4334,
          "name": "Interesting"
        }]
    
         //Put Objects Into As Associative Array. Each key consists of a composite value generated by each set of values from the objects in allContent.
        var noDupeObj = {} //Create an associative array. It will not accept duplicate keys.
        for (i = 0, n = allContent.length; i < n; i++) {
          var item = allContent[i]; //Store each object as a variable. This helps with clarity in the next line.
          noDupeObj[item.id + "|" + item.name] = item; //This is the critical step.
          //Here, you create an object within the associative array that has a key composed of the two values from the original object. 
          // Use a delimiter to not have foo+bar handled like fo+obar
          //Since the associative array will not allow duplicate keys, and the keys are determined by the content, then all duplicate content are removed. 
          //The value assigned to each key is the original object which is along for the ride and used to reconstruct the list in the next step.
        }
    
         //Recontructs the list with only the unique objects left in the doDupeObj associative array
        var i = 0;
        var nonDuplicatedArray = [];
        for (var item in noDupeObj) {
          nonDuplicatedArray[i++] = noDupeObj[item]; //Populate the array with the values from the noDupeObj.
        }
    
        console.log(nonDuplicatedArray)

    0 讨论(0)
  • 2020-12-02 21:55

    Here is a solution that works for me.

    Helper functions:

    // sorts an array of objects according to one field
    // call like this: sortObjArray(myArray, "name" );
    // it will modify the input array
    sortObjArray = function(arr, field) {
        arr.sort(
            function compare(a,b) {
                if (a[field] < b[field])
                    return -1;
                if (a[field] > b[field])
                    return 1;
                return 0;
            }
        );
    }
    
    // call like this: uniqueDishes = removeDuplicatesFromObjArray(dishes, "dishName");
    // it will NOT modify the input array
    // input array MUST be sorted by the same field (asc or desc doesn't matter)
    removeDuplicatesFromObjArray = function(arr, field) {
        var u = [];
        arr.reduce(function (a, b) {
            if (a[field] !== b[field]) u.push(b);
            return b;
        }, []);
        return u;
    }
    

    and then simply call:

            sortObjArray(dishes, "name");
            dishes = removeDuplicatesFromObjArray(dishes, "name");
    
    0 讨论(0)
  • 2020-12-02 21:57

    I use this function. its not doing any sorting, but produces result. Cant say about performance as never measure it.

    var unique = function(a){
        var seen = [], result = [];
        for(var len = a.length, i = len-1; i >= 0; i--){
            if(!seen[a[i]]){
                seen[a[i]] = true;
                result.push(a[i]);
            }
        }
        return result;
    }
    

    var ar = [1,2,3,1,1,1,1,1,"", "","","", "a", "b"]; console.log(unique(ar));// this will produce [1,2,3,"", "a", "b"] all unique elements.

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