簡體   English   中英

如何最好地比較JavaScript中的兩個多級對象以找到差異?

[英]How to best compare two multi-level objects in JavaScript in order to find differences?

所以我有一個JavaScript函數,它獲取一個對象並具有一個預先創建的對象。 目標是該函數將傳遞的對象的所有缺失屬性添加到預先創建的對象中。

只比較一個級別,這很容易。 例如,為了實現這一點:

Precreated: {hello: "world"}  
Passed: {hello: "there", colour: "green"}
Result: {hello: "world", colour: "green"}

您只需查看傳遞對象的每個鍵,查看該鍵是否已存在於預先創建的鍵中,如果不存在,則使用相應的值添加它。

但是,如果你想用多個級別來做這件事有點奇怪。 例如,我想要這個工作:

Precreated: {hello: {there: true}}
Passed: {hello: {world: true}}
Result: {hello: {there: true, world: true}}

我的想法是,我只是遍歷傳遞的對象,如果我在里面找到一個對象,再用該對象調用該函數,依此類推,直到所有子節點都被該函數處理。

但是,當您這樣做時,您必須動態地比較兩個對象的子項。 說,我在程序中知道它的深度是多少,調用了什么鍵等等,我如何以編程方式訪問它?

我問,因為我不能硬編碼像if (result[key1][key2][key3]... ,和if (result[keys.join(..)]...是不可能的我想也是。

那么我如何以編程方式訪問多層深度的對象的屬性,而不知道編寫代碼時有多深?

這個@ 4castle提到的帖子的現有答案應該是你想要的: https ://stackoverflow.com/a/34749873/1406083

我的想法是,我只是遍歷傳遞的對象,如果我在里面找到一個對象,再用該對象調用該函數,依此類推,直到所有子節點都被該函數處理。

你已經知道你想要使用遞歸,這很棒。 JavaScript允許您使用for ... in循環來反映對象的鍵。 您只需要確保要復制的對象確實是一個對象而不僅僅是一個值。

我鏈接的答案使用自己的isObject 使用Object.assign遞歸方式完成對象填充

你可以使用for..of循環, Object.keys()來檢查傳遞對象的屬性是否是一個對象,如果true是遞歸調用原始對象的函數,傳遞對象和傳遞對象的鍵作為參數然后將屬性賦值給原始對象, else檢查原始對象中是否存在屬性,如果為true,則將傳遞的屬性賦值給原始對象。

 var precreated1 = { hello: { there: true } }; var precreated2 = { hello: "world" }; function addProps(props, obj, key) { for (let prop of Object.keys(props)) { if (Object.getPrototypeOf(props[prop]) === Object.prototype) { addProps(props[prop], obj, prop) } else { if (key) { obj[key][prop] = props[prop] } else { if (!(prop in obj)) { obj[prop] = props[prop] } } } } } addProps({ hello: { world: true } }, precreated1); console.log("precreated1:", precreated1); addProps({ hello: "there", colour: "green" }, precreated2); console.log("precreated2:", precreated2); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM