2016-05-29 68 views
0

我正在研究一個JavaScript函數,它將源對象(或多個對象 - 這很重要)的可枚舉屬性分配給目標對象。還有一項規定是,後續來源將覆蓋以前來源的財產分配。使用reduce來將源對象的枚舉屬性擴展到目標對象

我的確在搜索和閱讀很多類似的問題,但由於幾個原因我遇到了麻煩。說實話,我已經堅持了三天。

故障現場1:提供的樣板只是function extend(){}沒有參數。我不確定是否添加參數。我相信這可以寫成任何一種方式。

問題點2:我可以編寫成功將一個對象擴展到另一個對象的代碼,但沒有任何擴展來自多個來源。

因此,舉例來說,如果函數將被稱爲正是如此:

extend({ 'name': 'lola' }, { 'age': 9 }, { 'name': 'mickey' });

結果應該是{ 'user': 'mickey', 'age': 9 }

指導是極大的讚賞。

回答

2

這似乎是Object.assign, 一個完美的情況下這是一個ES6功能,使檢查目標瀏覽器的支持;

var objects = [{ 'name': 'lola' }, { 'age': 9 }, { 'name': 'mickey' }] 
 

 
var r = objects.reduce((a,b) => Object.assign(a,b)); 
 

 
console.log(r)

在這個片段

我使用[].reduce用於通過對象數組循環和對蓄能器對象執行;使用塗布運營商和分配給新的對象 這將修改數組的第一個條目..


可能是一個更好的解決方案:

var objects = [{ 'name': 'lola' }, { 'age': 9 }, { 'name': 'mickey' }] 
 

 
var r = Object.assign({}, ...objects) 
 

 
console.log(r)

+0

嗯,是它的真的如此...... – Redu

+0

在第二個片段中,你甚至不需要空對象就像'var r = Object.assign(... objects);' – Redu

+1

@Redu是的,你可以,但是這會修改fir st item;可能是一個問題,使用新對象更安全; – maioman

1

只是爲了好玩,讓我們發明了Object.prototype.concat()。它在這裏;

Object.prototype.concat = function(...o){ 
 
    return o.reduce((p,c) => (Object.keys(c).forEach(k => p[k] = c[k]),p),this); 
 
}; 
 

 
var objects = [{ 'name': 'lola' }, { 'age': 9 }, { 'name': 'mickey' }], 
 
    reduced = {}.concat(...objects); 
 

 
console.log(JSON.stringify(reduced));