2016-05-29 33 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));