2017-09-15 19 views
1

我解決了一個問題,其中的任務是從輸入數組中合併多個對象,並返回合併了所有鍵和值的單個對象。如果輸入數組中有一個或多個對象存在密鑰,則該密鑰的最新值應存儲在最終返回的對象中。如何在數組和對象上一起使用JavaScript擴展語法?

一個例子 -

var a={1:'1',2:'2',3:'3'}, 
    b={3:'4',5:'6',6:'7',7:'8'}, 
    c={5:'9',8:'9',6:'12',23:'35'} 
    o=[a,b,c]; 

返回的對象應該是 -

{ '1': '1','2': '2','3': '4','5': '9','6': '12','7': '8','8': '9','23':'35' }

作爲重複鍵情況下的例子,鍵3存在於兩個對象ab,所以在最終結果的值爲{3:'4'},因爲這是最新的。

我想在此問題中使用spread syntax作爲對象,但只解決了其中的一部分。我的意思是,如果我使用傳播的每個單獨的對象,這樣的作品,像 -

function foo() { 
 
    var a={'1':'1','2':'2','3':'3'}, 
 
    b={'3':'4','5':'6','6':'7','7':'8'}, 
 
    c={'5':'9','8':'9','6':'12','23':'35'}, 
 
    arr = [a,b,c]; 
 
    
 
    return {...arr[0], ...arr[1], ...arr[2]} 
 
} 
 

 
console.log(foo());

對於這項工作,我需要寫出來與傳播每個數組元素,如上面的片段 - ...arr[0], ...arr[1], ...arr[2]。但是,輸入數組可以包含任意數量的對象,因此寫出每個元素是不可行的。

通常情況下,使用像數組中的迭代傳播,可以讓你展開數組元素,如所謂

var parts = ['shoulders', 'knees']; 
 
var lyrics = ['head', ...parts, 'and', 'toes']; 
 
console.log(lyrics)

是否有可能使用傳播輸入陣列上收集所有可以再次應用傳播的單個對象來獲得最終對象?

回答

1

你可以只使用Object.assign()

return Object.assign(...arr); 

這裏有一個完整的片段:

function foo() { 
 
    var a={'1':'1','2':'2','3':'3'}, 
 
    b={'3':'4','5':'6','6':'7','7':'8'}, 
 
    c={'5':'9','8':'9','6':'12','23':'35'}, 
 
    arr = [a,b,c]; 
 
    
 
    return Object.assign(...arr); 
 
} 
 

 
console.log(foo());

注意,這隱含修改您的數組中的第一個對象。如果你不希望這樣,通過一個新的空對象作爲第一個參數Object.assign()

return Object.assign({}, ...arr); 
0

您可以直接使用的對象傳播語法合併。

function foo() { 
 
    var a={'1':'1','2':'2','3':'3'}, 
 
     b={'3':'4','5':'6','6':'7','7':'8'}, 
 
     c={'5':'9','8':'9','6':'12','23':'35'}; 
 
    return {...a, ...b, ...c}; 
 
} 
 

 
console.log(foo());

如果你有一個數組,那麼你可以使用array#reduceObject#assign

var a={'1':'1','2':'2','3':'3'}, 
 
    b={'3':'4','5':'6','6':'7','7':'8'}, 
 
    c={'5':'9','8':'9','6':'12','23':'35'}, 
 
    arr = [a,b,c]; 
 
var result = arr.reduce(function(r,o){ 
 
    return Object.assign(r,o); 
 
},Object.create(null)); 
 

 
console.log(result);

:用於ECMAScript的提案其餘/蔓延特性(階段3)增加了傳播特性爲對象文字。它將自己提供的對象的枚舉屬性複製到一個新的對象上。