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

use reduce to extend enumerable properties of source object(s) to the destination object

我正在开发一个 JavaScript 函数,它将一个源对象(或多个对象——这很重要)的可枚举属性分配给目标对象。附加规定是后续来源会覆盖先前来源的 属性 分配。

我确实搜索并阅读了许多类似的问题,但由于一些原因,我 运行 遇到了麻烦。说实话,卡了三天了

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

问题点 2:我可以编写成功将一个对象扩展到另一个对象的代码,但无法编写从多个源扩展的代码。

例如,如果要这样调用函数:

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

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

非常感谢指导。

只是为了好玩让我们发明 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));

这似乎是 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)