我试图将一个对象数组组合成一个对象,该对象合并所有类似属性的值。
objArray = [{
foo: ["f", "b"],
bar: ["e"]
}, {
foo: ["a", "c"],
bar: ["a", "c"]
}, {
foo: ["f", "b"],
bar: ["z"]
}];
const newObj = {
foo: [],
bar: []
};
objArray.forEach((obj) => {
newObj.foo.push(...obj.foo);
newObj.bar.push(...obj.bar);
});
console.log(newObj);
通过上面的代码,我得到了所需的输出。是否像上面那样使用forEach循环是实现我要设置的最佳方法?理想情况下,我不需要指定要合并的属性,我希望代码自动合并相同的属性名称。
编辑:
我需要支持IE11
答案 0 :(得分:2)
可以使用嵌套的Object#entries()
的reduce()来迭代属性,而无需在任何地方硬编码特定的属性名称
objArray = [{
foo: ["f", "b"],
bar: ["e"]
}, {
foo: ["a", "c"],
bar: ["a", "c"]
}, {
foo: ["f", "b"],
bar: ["z"]
}];
const res= objArray.reduce((acc,c)=>{
return Object.entries(c).reduce((a,[k,v])=>{
a[k] = (a[k] || []).concat(v)
return a
},acc)
},{})
console.log(res)
答案 1 :(得分:0)
您可以获取对象的条目以获取任意数量的键和值。
var data = [{ foo: ["f", "b"], bar: ["e"] }, { foo: ["a", "c"], bar: ["a", "c"] }, { foo: ["f", "b"], bar: ["z"] }],
merged = data.reduce((r, o) =>
Object.entries(o).reduce((s, [k, v]) =>
Object.assign(s, { [k]: (s[k] || []).concat(v) }), r), {});
console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:0)
要获得预期结果,请使用Object.keys并使用forEach进行两个循环
objArray = [
{
foo: ["f", "b"],
bar: ["e"],
zoo: ["z"]
},
{
foo: ["a", "c"],
bar: ["a", "c"]
},
{
foo: ["f", "b"],
bar: ["z"]
}
];
const newObj = {
foo: [],
bar: []
};
objArray.forEach(obj => {
Object.keys(obj).forEach(v => {
if (newObj.hasOwnProperty(v)) {
newObj[v].push(obj[v]);
}
});
});
console.log(newObj);
codepen供参考-https://codepen.io/nagasai/pen/MqOpWm?editors=1010
答案 3 :(得分:0)
像您一样使用forEach,但内部使用for in
。
var objArray = [{foo: ["f", "b"],bar: ["e"]},{foo: ["a", "c"],bar:["a", "c"]},{foo: ["f", "b"],bar: ["z"]}];
var newObj = {};
objArray.forEach(o => {
for (p in o) {
if (!(p in newObj)) {
newObj[p] = [];
}
newObj[p] = [...newObj[p], ...o[p]];
}
});
console.log(newObj);
答案 4 :(得分:0)
获取@charlietfl答案并将其编辑为IE(使用Object.keys
代替Object.entries
)
objArray = [{
foo: ["f", "b"],
bar: ["e"]
}, {
foo: ["a", "c"],
bar: ["a", "c"]
}, {
foo: ["f", "b"],
bar: ["z"]
}];
const res = objArray.reduce((acc, c) => {
return Object.keys(c).reduce((a, k) => {
let v = c[k];
a[k] = (a[k] || []).concat(v);
return a;
}, acc);
}, {});
console.log(res)