使用reduce将源对象的可枚举属性扩展到目标对象

时间:2016-05-29 20:30:05

标签: javascript arrays object extend reduce

我正在开发一个JavaScript函数,它将源对象的可枚举属性(或对象 - 重要的)分配给目标对象。另外一项规定是,后续来源会覆盖以前来源的财产分配。

我确实搜索并阅读了许多类似的问题,但我遇到了麻烦,原因有两个。说实话,我已经坚持了三天。

故障点1:提供的样板仅为function extend(){},没有参数。我不确定是否要添加参数。我敢肯定它可以写成任何一种方式。

麻烦点2:我可以编写成功将一个对象扩展到另一个对象的代码,但不会从多个来源扩展。

因此,例如,如果要调用该函数:

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

结果应为{ 'user': 'mickey', 'age': 9 }

非常感谢指导。

2 个答案:

答案 0 :(得分: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来循环遍历对象数组并对累加器对象执行; 这将修改数组的第一个条目..

使用spread运算符并分配给新对象可能是更好的解决方案:

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

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

console.log(r)

答案 1 :(得分: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));