问题描述
我想使用扩展语法将多个未知对象的属性复制到一个对象中。像这样:
var array = [{a:0},{b:1},{c:2}]; // This array Could hold any number of objects
// This function should take the objects in the array and use spread Syntax to create a new object.
function merge(arr) { /* Code I wish I knew */ } // returns an object
var combo = merge(array);
console.log(combo); // {a:0,b:1,c:2}
我知道 Object.assign
。我问这个问题的原因只是想看看这种事情是否可以用扩展语法来完成。此外,我还关心 V8 的隐藏类。据我了解,在实例化后修改对象会对隐藏类的性能产生负面影响。我读过 Spread 没有这个问题,可能是因为它用其他对象的所有属性实例化了对象。
解决方法
您可以将 Array.reduce
与 Object.assign
结合使用:
var array = [{a:0},{b:1},{c:2}];
function merge(arr) {
return array.reduce((x,y) => Object.assign(x,y))
//
// per the comments,if we don't want to mutate the original object we can do instead:
// return array.reduce((x,y),{})
}
var combo = merge(array);
console.log(combo);
您可以使用 Array#reduce
迭代数组并将子项合并为一个对象:
var array = [{a:0},{c:2}];
function merge(arr) {
return arr.reduce((acc,cur) => ({ ...acc,...cur }));
}
var combo = merge(array);
console.log(combo);