How to merge two arrays of JSON objects - removing duplicates and preserving order in Javascript/jQuery?

后端 未结 4 678
自闭症患者
自闭症患者 2020-12-29 12:38

jsfiddle link: http://jsfiddle.net/vN6fn/1/

Assume I have these 2 objects:

var obj1 = { data: [ 
                      {id:1, commen         


        
相关标签:
4条回答
  • 2020-12-29 13:11

    http://jsfiddle.net/J9EpT/

    function merge(one, two){
      if (!one.data) return {data:two.data};
      if (!two.data) return {data:one.data};
      var final = {data:one.data};
      // merge
      for(var i = 0 ; i < two.data.length;i++){
          var item = two.data[i];
          insert(item, final);
      }
      return final;
    }
    
    
    function insert(item, obj){
        var data = obj.data;
        var insertIndex = data.length;
        for(var i = 0; i < data.length; i++){
            if(item.id == data[i].id){
               // ignore duplicates
               insertIndex = -1;
               break;
            } else if(item.id < data[i].id){
               insertIndex = i;
               break;
            }
        }
        if(insertIndex == data.length){
            data.push(item);
        } else if(insertIndex != -1) {
            data.splice(insertIndex,0,item);
        }
    }
    
    var final = merge(obj1, obj2);
    
    0 讨论(0)
  • 2020-12-29 13:13

    You can use $.merge and then go through and remove duplicates, and then sort it.

    $.merge(obj1.data, obj2.data);
    
    var existingIDs = [];
    obj1.data = $.grep(obj1.data, function(v) {
        if ($.inArray(v.id, existingIDs) !== -1) {
            return false;
        }
        else {
            existingIDs.push(v.id);
            return true;
        }
    });
    
    obj1.data.sort(function(a, b) {
        var akey = a.id, bkey = b.id;
        if(akey > bkey) return 1;
        if(akey < bkey) return -1;
        return 0;
    });
    
    0 讨论(0)
  • 2020-12-29 13:19

    Merge two array of objects removing duplicates

    • Using Es6 map() and filter() method

    var obj1 = { data: [ 
                          {id:1, comment:"comment1"},
                          {id:2, comment:"comment2"},
                          {id:3, comment:"comment3"}
                       ] }
    
    var obj2 = { data: [ 
                          {id:2, comment:"comment2"},
                          {id:3, comment:"comment3"},
                          {id:4, comment:"comment4"}
                        ]}
    let obj3 = [...obj1.data, ...obj2.data]
    
    function mergeUniqueArray(arr, comp) {
    
      let unique = arr
        .map(item => item[comp])
    
         // store the keys of the unique objects
        .map((item, i, final) => final.indexOf(item) === i && i)
    
        // eliminate the duplicate keys & store unique objects
        .filter(item => arr[item]).map(item => arr[item]);
        
       return unique;
    }
    
    console.log(mergeUniqueArray(obj3,'id'));

    0 讨论(0)
  • 2020-12-29 13:25

    Here is a straight jQuery solution:

    function mergeDeep(o1, o2) {
        var tempNewObj = o1;
    
        //if o1 is an object - {}
        if (o1.length === undefined && typeof o1 !== "number") {
            $.each(o2, function(key, value) {
                if (o1[key] === undefined) {
                    tempNewObj[key] = value;
                } else {
                    tempNewObj[key] = mergeDeep(o1[key], o2[key]);
                }
            });
        }
    
        //else if o1 is an array - []
        else if (o1.length > 0 && typeof o1 !== "string") {
            $.each(o2, function(index) {
                if (JSON.stringify(o1).indexOf(JSON.stringify(o2[index])) === -1) {
                    tempNewObj.push(o2[index]);
                }
            });
        }
    
        //handling other types like string or number
        else {
            //taking value from the second object o2
            //could be modified to keep o1 value with tempNewObj = o1;
            tempNewObj = o2;
        }
        return tempNewObj;
    };
    

    Demo with complex objects. I have turned this into a blog-post showing the difference between jQuery's .extend() and my script here.

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