[英]Finding Difference Between Values in Two JavaScript Arrays of Objects
我有兩個包含對象的 JavaScript 數組,如下所示:
var array1 = [{'123': '18'}, {'578': '2'}, {'323': '5'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];
每個數組將具有與另一個相同的鍵(盡管順序可能不同)。 但是,給定鍵的值可能不同。 我想要的是array2
中的對象數組,它們對array1
的相同鍵具有不同的值。 所以,對於這個例子,我想要:
[{'578': '1'}, {'323': '3'}]
我嘗試過的我嘗試使用 jQuery 的.inArray()
和.grep()
方法來做到這一點,但這些方法將每個對象都交還給我,而不僅僅是那些值發生變化的對象:
difference = $.grep(array1,function(x) {
return $.inArray(x, array2) < 0
})
這是我的小提琴。 jQuery 或常規 JavaScript(甚至 Angular)解決方案會很棒。 謝謝。
嘗試這個:
var array1 = [{'578': '2'}, {'123': '18'}, {'323': '5'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];
var removed = [];
for(var k in array2){
var found = k;
for(var x in array2){
if(JSON.stringify(array2[k]) == JSON.stringify(array1[x])){
found = true;
break;
}
}
if(found !== true){
removed.push(array2[found]);
}
}
array2 = removed;
console.log(array2);
輸出:
[Object { 578="1"}, Object { 323="3"}]
首先,您需要將“鍵值”對象合並為一個以啟用鍵的直接查找,而不管順序如何。
var argList = [{}].concat(array2);
// lookup will contain all key-value pairs in array2
var lookup = $.extend.apply($, argList);
然后,遍歷 array1 並使用鍵查找 array2 中的相應值並收集results
數組中的差異:
var results = [];
$.each(array1, function(index, element) {
for (var k in element) {
if (element[k] != lookup[k])
results.push({ k : lookup[k] });
}
});
您的方法失敗的原因是,javascript 通過比較引用來比較數組和對象。 例如
var a = ['a','b','c'];
var b = ['a','b','c'];
a === b; // false
我建議你,檢查這個答案:
創建一個愚蠢的代碼,但順序並不重要。
var array1 = [{'123': '18'}, {'578': '2'}, {'323': '5'}]; var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}]; var array3 = [{'578': '1'}, {'323': '3'}, {'123': '18'}]; function getDiff(array1, array2) { var map = {}; var result = []; var l = array1.length; var i, obj, key; for (i = 0; i < l; ++i) { obj = array1[i]; key = JSON.stringify(obj); map[key] = true; } var compare; for (i = 0; i < l; ++i) { obj = array2[i]; key = JSON.stringify(obj); if (map[key] !== true) { result.push(obj); } } return result; } console.log(getDiff(array1, array2)); console.log(getDiff(array1, array3));
只是一些樂趣過濾器:
var array1 = [{'123': '18'}, {'578': '2'}, {'323': '5'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];
difference = array1.filter(function(el, index) {
return JSON.stringify(el) !== JSON.stringify(array2[index]);
});
console.log(difference);
這實際上與循環一個數組並檢查另一個數組相同,但您不會有索引等,只是更緊湊。
只是一個旁注:你不能直接比較對象,因為===
運算符檢查它們是否產生相同的內存位置,所以最干凈和最快的解決方案是將它們轉換為字符串(使用 JSON.stringify)並檢查它們是否真的畢竟同樣的事情。
即使順序更改,以下代碼段也有效。
var array1 = [{'123': '18'}, {'578': '2'}, {'323': '5'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];
var res=[];
for(var i=0;i<array2.length;i++){
var jsonObj=array2[i];
var j=0; var key;
for(var k in jsonObj){
if(j==0){
key=k;
j++;
}
}
var value=array2[i][key];
var flag=0;
for(var i2=0;i2<array1.length;i2++){
if(array1[i2][key]==value) flag=1;
}
if(flag==0)res.push(array2[i])
}
console.log(res);
最后打印 res.
使用java腳本JSBIN
var array1 = [ {'578': '2'}, {'323': '5'},{'123': '18'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];
var result = [];
for(var k in array2){
var key = Object.keys(array2[k]).join();
for(var l in array1){
if(array1[l][key]){
if(array1[l][key] != array2[k][key]){
result.push(array2[k]);
}
}
}
}
console.log(JSON.stringify(result));
//"[{\"578\":\"1\"},{\"323\":\"3\"}]"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.