[英]Nested object assign Javascript
我有兩個這樣的對象:
var a = {prop:{a:'1'}}
var b = {prop:{b:'1'}}
我想使用 Object.assign 合並兩個對象。 我試過這個:
var c = Object.assign(a,b)
> {prop:{b:'1'}}
我如何獲得此輸出:
{prop:{a:'1',b:'1'}}
簡而言之,我想對每個子對象進行對象分配 =>(如果存在財產,請首先檢查兒童,如果它是對象,請勿覆蓋)
您可以為對象的每個級別使用深度合並功能。
函數deepMerge
作為給定目標的單個函數或作為Array#reduce
回調,其中迭代一個對象數組,並提供一個空對象作為還原的startvalue
。
函數/回調itselft有兩個參數,一個用於目標對象,另一個用於源對象,其中所有條目都被采用和迭代。
檢查對象的值,如果類型是對象,則使用新的目標屬性(如果未給出)或exitent屬性對deepMerge
進行遞歸調用。
如果該值不是對象,則使用給定鍵將值分配給target
。
結果是一個具有給定對象的所有屬性的新對象。
function deepMerge(target, source) { Object.entries(source).forEach(([key, value]) => { if (value && typeof value === 'object') { deepMerge(target[key] = target[key] || {}, value); return; } target[key] = value; }); return target; } var a = { prop: { a: '1' } }, b = { prop: { b: '1' } }, c = [a, b].reduce(deepMerge, {}); console.log(c);
由於你的案例中的a和b包含一個具有相同名稱的屬性,當你執行像Object.assign(a,b)
這樣的事情時Object.assign(a,b)
的prop
屬性會覆蓋並且不會合並prop。 參考
請嘗試以下方法:
var a = {prop:{a:'1'}} var b = {prop:{b:'1'}} var c = {}; c.prop = Object.assign({},a.prop,b.prop); console.log(c);
要么
您可以編寫自己的自定義函數,該函數可以合並具有相同屬性的對象的值。
請嘗試以下方法:
function merge(source, target) { Object.keys(source).forEach((k) => { if (source[k].constructor.toString().indexOf('Object') > -1 && target[k]) { merge(source[k], target[k]); return; } target[k] = source[k]; }); return target; } var a = {prop:{a: '1'}}; var b = {prop:{ b: '1'}}; var c = {}; [a,b].forEach((e)=>merge(e, c)); console.log(c);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.