13

我有兩個JavaScript數組orig(對象的原始數組)和update(更新的對象的orig數組),它們具有相同的長度幷包含對象,並且我想輸出每對對象之間的差異。如何找到兩個JavaScript對象數組之間的差異?

例子:

var orig = [{enabled:"true", name:"Obj1", id:3},{enabled:"true", name:"Obj2", id:4}]; 

var update = [{enabled:"true", name:"Obj1", id:3}, {enabled:"true", name:"Obj2-updated", id:4}]; 

輸出應該是:name:"Obj2-updated"

我實現的東西,但它需要優化......

for(var prop=0; prop<orig.length; prop++) { 
    for(prop=0; prop<update.length; prop++) { 
    if(orig[prop].enabled != update.enabled) { console.log(update.enabled) } 
    if(orig[prop].name != update[prop].name) { console.log(update[prop].name) } 
    if(orig[prop].id != update[prop].id) { console.log(update[prop].id) } 
    } 
} 
+0

是輸出一個字符串還是一個對象?或者包含對象或字符串的數組,或者? –

+0

雖然我不知道你的用例,但我只有一個已更改值的列表,而不知道哪個鍵和哪個對象的變化值存在,你確定你不需要更多的細節?我並不是想貶低你的問題,但是我試圖預測你的下一個問題可能是什麼,如果你錯了只需要改變的價值。 –

+0

我只是需要輸出創建一個字符串文本,說:「嘿,你改變Obj2 Obj2更新」。但我只需要知道哪個屬性被修改了。 – Valip

回答

12

你可以過濾鍵和獲取與更新的密鑰的結果集。

var orig = [{ enabled: "true", name: "Obj1", id: 3 }, { enabled: "true", name: "Obj2", id: 4 }], 
 
    update = [{ enabled: "true", name: "Obj1", id: 3 }, { enabled: "true", name: "Obj2-updated", id: 4 }], 
 
    difference = []; 
 

 
orig.forEach(function (a, i) { 
 
    Object.keys(a).forEach(function (k) { 
 
     if (a[k] !== update[i][k]) { 
 
      difference.push({ id: update[i].id, key: k, value: update[i][k], index: i }); 
 
     } 
 
    }); 
 
}); 
 

 
console.log(difference);

+0

你能請告訴我是否有方法記錄修改後的對象?在這種情況下,{{enabled:「true」,name:「Obj2-updated」,id:4}' – Valip

+7

你明白了,這就是爲什麼[如果你確信你只需要改變的值](http://stackoverflow.com/questions/39074429/how-to-find-differences-between-two-javascript-arrays-of-objects#comment65497981_39074429)。到目前爲止,問題已經發生了變化,並且所需的返回值已經從已更改的值更改爲已更改值*和*該值的關鍵字,現在*您已決定要整個修改要返回的對象。請在提出問題之前花五分鐘*來正確地撰寫問題。 –

+1

@PavelValeriu,如果我知道,**結果應該如何,我可以給出答案。所以你需要什麼?該對象,或索引或鍵/值對或什麼? –

6

假設,這兩個屬性名稱相同並且這些值只是基元(無對象,數組等):

Object.keys(orig) 
     .forEach((key) => { 
     if(orig[ key ] !== update[ key ]) { 
      console.log(update[key]); 
     } 
     }); 
+0

我可以使用'orig [prop] [key]'嗎? – Valip

+0

@PavelValeriu要做什麼?在你的示例代碼中,你假設兩個變量都包含數組,但實際上它們是對象。所以你的'。長度「實際上不應該工作(除非你明確地設置它) – Sirko

+0

這是不值得我發佈一個單獨的答案,因爲它本質上是相同的,但由於OP只想知道哪些值是不同的(不參考鍵,顯然)使用['Object.values()'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/values)更容易一些,而不是訪問值通過每次迭代時的鍵(這確實需要在瀏覽器中實現'Object.values()',但顯然)。 –

3

使用Object.keys來循環你的對象。喜歡的東西:

var orig = { 
 
    enabled: "true", 
 
    name: "Obj1", 
 
    id: 3 
 
}; 
 

 
var update = { 
 
    enabled: "true", 
 
    name: "Obj1-updated", 
 
    id: 3 
 
}; 
 

 
var diff = {}; 
 

 
Object.keys(orig).forEach(function(key) { 
 
    if (orig[key] != update[key]) { 
 
    diff[key] = update[key]; 
 
    }; 
 
}) 
 

 
console.log(diff);

3

您可以使用一個循環來遍歷原始對象的屬性和核對更新的對象,找出哪些屬性已被修改。

var orig = { 
 
    enabled: "true", 
 
    name: "Obj1", 
 
    id: 3 
 
}; 
 

 
var update = { 
 
    enabled: "true", 
 
    name: "Obj1-updated", 
 
    id: 3 
 
}; 
 

 
for (var key in orig) { 
 
    if (orig[key] !== update[key]) { 
 
    console.log(key + ': ' + update[key]); 
 
    } 
 
}

0

你可以使用一個像庫或lodash Ramda做以簡明的方式。在拉達的情況下你可以這樣做: R.difference(update, orig);

相關問題