我想转此:
let myArray = [ {city: "NY"}, {status: 'full'} ];
到此:
let myObj = { city: "NY", status: 'full' };
我试过这个:
let newObj = {};
for (var i = 0; i < myArray.length; i++) {
(function(x) {
newObj = Object.assign(myArray[i]);
})(i);
}
它将最后一对分配给对象
答案 0 :(得分:11)
Spread将数组导入Object#assign:
const myArray = [ {city: "NY"}, {status: 'full'} ];
const myObj = Object.assign({}, ...myArray);
console.log(myObj);
&#13;
注意:分配到空对象。如果省略空对象,原始数组的第一个元素将被突变(所有内容都将合并到其中)。
答案 1 :(得分:3)
您还可以使用Array.reduce()
来提供更精细的颗粒控制:
const myArray = [
{ city: 'NY', color: 'blue', rodents: { small: false, medium: false, large: true } },
{ status: 'full', color: 'red' },
{ sandwich: 'flavourful' },
]
// item is each object in your array
const reduced = myArray.reduce((newObj, item) => {
// existing props will be overwritten by newer object entries in the array
// this example is same as Object.assign spread with right to left precedence,
// until you want more custom logic
Object.keys(item).forEach((key) => { newObj[key] = item[key] })
return newObj
}, {})
console.log(reduced)
// you will see `red` overwrite `blue`
编辑:在一年之后检查了这个答案之后,我注意到它根本没有针对深度克隆或深度合并的能力进行优化。我建议您更接近研究这些方面,如果您的工作不稳定,请小心复制或破坏参考文献。
在上面的示例中没有问题,因为所有值都是基元。
答案 2 :(得分:2)
我倾向于同意您的问题似乎是关于创建一个通常不是一个好计划的索引对象,但如果必须用数字键入您的对象,您可以这样做像这样:
let newObj = {};
myArray.forEach((val, index) => { newObj[index] = val });
答案 3 :(得分:1)
let myArray = [ {city: "NY"}, {status: 'full'} ];
let newObj = myArray.reduce((acc, curr) => {
Object.keys(curr).forEach(val => {
acc[val] = curr[val]
})
return acc
}, {})
console.log(newObj)
根据caniuse.com
,IE支持此语法