2015-11-04 30 views
1

陣列我有以下兩個數組,以獲得獨特的對象:如何通過比較兩組使用Javascript

var data1=[ 
    { 
     "id": 1, 
     "url": "http://192.168.1.165:90/asset/" 
    }, 
    { 
     "id": 2, 
     "url": "Assigned" 
    } 


] 
var data2=[ 
    { 
     "id": 1, 
     "url": "http://192.168.1.165:90/asset/" 
    }, 
    { 
     "id": 2, 
     "url": "Assigned" 
    }, 
{ 
     "id": 3, 
     "url": "Assigned" 
    } 

] 

結果:

var unique=[{ { 
      "id": 3, 
      "url": "Assigned" 
     }}] 

我怎樣才能從這兩獲得唯一對象數組? 我已經使用for循環這樣的嘗試:

var unique = []; 
for(var i = 0; i < data2.length; i++){ 
    var found = false; 
    for(var j = 0; data1.length; j++){ 
    if(data2[i].id == data1[j].id){ 
     found = true; 
     break; 
    } 
    } 
    if(found == false){ 
    unique.push(array1[i]); 
    } 
} 

,但希望使用功能的JavaScript得到一個解決方案...

+0

不是一個真正的解決方案,但對於所有的事情功能的JavaScript,顯然[lodash(https://lodash.com/)是相當偉大的...從來沒有使用過自己,但它可能適用於你! –

+0

的可能的複製[在JavaScript對象數組的聯盟?](http://stackoverflow.com/questions/13319150/union-of-array-of-objects-in-javascript) – valepu

回答

1

嘗試這樣

var joined = data1.concat(data2); 
var temp = []; 
joined.forEach(function (x) { 
    var objList=joined.filter(function(y){ return y.id == x.id}); 
    if(objList.length == 1) // if data count of current item in merged array is 1 that's means it belong to only one data source 
     temp.push(x); 
}) 

console.log(temp) 

JSFIDDLE

+0

我想只有唯一對象 – forgottofly

+0

做你檢查了我的小提琴? @forgottofly –

+0

是啊,我得到3個對象 – forgottofly

1

試試這個:首先從data1得到對象它們不在data2中,如果它在那裏則從data2中刪除,然後concat它與data2

<script> 
 
var data1=[ 
 
     { 
 
      "id": 1, 
 
      "url": "http://192.168.1.165:90/asset/" 
 
     }, 
 
     { 
 
      "id": 2, 
 
      "url": "Assigned" 
 
     } 
 

 

 
    ]; 
 
    var data2=[ 
 
     { 
 
      "id": 1, 
 
      "url": "http://192.168.1.165:90/asset/" 
 
     }, 
 
     { 
 
      "id": 2, 
 
      "url": "Assigned" 
 
     }, 
 
    { 
 
      "id": 3, 
 
      "url": "Assigned" 
 
     } 
 

 
    ]; 
 
    
 
    var arr3 = []; 
 
    for(var i in data1){ 
 
     var dup = false; 
 
     for (var j in data2){ 
 
    \t if (data2[j].id == data1[i].id && data2[j].url == data1[i].url) { 
 
      data2.splice(j,1); 
 
      } 
 
     } 
 
     if(dup) arr3.push(arr1[i]) 
 
     
 
    } 
 

 
    arr3 = arr3.concat(data2); 
 
console.log(arr3); 
 
</script>

+0

,我只需要唯一對象 – forgottofly

+0

@forgottofly更新的答案會給只有一條記錄爲ID = 3的當前數據。 –

+0

非常感謝@Suchit – forgottofly

1

編輯的產生的獨特對象

假設你有一個函數:

function unique(arr) { 
var uni = []; 
for(var i=0; i<arr.length; ++i) { 
    var rep = -1; 
    for(var j=0; j<arr.length; ++j) 
     if(arr[i].id == arr[j].id) rep++; 
    if (!rep) uni.push(arr[i]); 
} 
return uni; 

}

這樣的工作,給你一個唯一的對象:

var u = unique(data1.concat(data2)); 
1

這樣做是爲了使兩者的聯合給定數組,然後遍歷setA並查找setAunion中的匹配屬性和值。如果找到,則索引被存儲。如果索引不止一個,則刪除union中的所有項目。

其餘的是symmetric difference

var data1 = [{ "id": 1, "url": "http://192.168.1.165:90/asset/" }, { "id": 2, "url": "Assigned" }], 
 
    data2 = [{ "id": 1, "url": "http://192.168.1.165:90/asset/" }, { "id": 2, "url": "Assigned" }, { "id": 3, "url": "Assigned" }]; 
 

 
function symmetricDifference(setA, setB) { 
 
    var union = setA.concat(setB); 
 
    setA.forEach(function (a) { 
 
     var aK = Object.keys(a), 
 
      indices = []; 
 
     union.forEach(function (u, i) { 
 
      var uK = Object.keys(u); 
 
      aK.length === uK.length && 
 
      aK.every(function (k) { return a[k] === u[k]; }) && 
 
      indices.push(i); 
 
     }); 
 
     if (indices.length > 1) { 
 
      while (indices.length) { 
 
       union.splice(indices.pop(), 1); 
 
      } 
 
     } 
 
    }); 
 
    return union; 
 
} 
 
document.write('<pre>' + JSON.stringify(symmetricDifference(data1, data2), 0, 4) + '</pre>');