2012-02-03 11 views
8

jsfiddleリンク:http://jsfiddle.net/vN6fn/1/JSONオブジェクトの2つの配列をマージする方法 - 重複を削除し、Javascript/jQueryで順序を保持しますか?

が、私はこれらの2つのオブジェクトがあるとします。

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"} 
        ] } 

そして、最終的なオブジェクトは、次のようになります。ここでは

var final = { data: [ 
         {id:1, comment:"comment1"}, 
         {id:2, comment:"comment2"}, 
         {id:3, comment:"comment3"}, 
         {id:4, comment:"comment4"} 
        ] } 

は、考慮すべきいくつかのものです:

  • obj1とobj2がでたり(私はforループを行うことができます知っているが、私はこれを行うには良い方法を探しています)重複を削除しません、

$.extend()は、オブジェクトを置き換える$.merge()を重複を持っていない可能性があります。

+1

オブジェクト1が最初であるため、順序平均(3,4,5,1,2)は保持されませんか? –

+0

ごめんなさい、私はオブジェクトの番号付けを変更することができます。 – Sherzod

+0

@ shershames Hm、それは私の混乱を解消しなかった。それはどういう意味ですか? –

答えて

14

$.mergeを使用して、重複して削除してから並べ替えることができます。ここ

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

ありがとう@ロケットハズマト..... – Patel

1

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); 
3

ストレートjQueryの溶液である:複雑なオブジェクトと

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。これをjQueryの.extend()と私のスクリプトhereの違いを示すブログ投稿に変えました。

+0

まさに私が探していたもの。私に仕事を救ってくれてありがとう! – hman

関連する問題