我需要通过键合并对象数组列表。我试图在线查找资料,但最终只合并了2个对象阵列。
但是我在一个数组中有多个对象数组。
response = [
[
{
"topic": "Topic 1",
"avgwk38": 5
},
{
"topic": "Topic 2",
"avgwk38": 86
},
{
"topic": "Topic 3",
"avgwk38": 6
}
],
[
{
"topic": "Topic 1",
"avgwk39": 25
},
{
"topic": "Topic 2",
"avgwk39": 32
},
{
"topic": "Topic 3",
"avgwk39": 4
}
]
]
这是我的预期结果。
[
{
"topic": "Topic 1",
"avgwk38": 5,
"avgwk39": 25
},
{
"topic": "Topic 2",
"avgwk38": 86,
"avgwk39": 32
},
{
"topic": "Topic 3",
"avgwk38": 6,
"avgwk39": 4
}
]
请帮我解决这个问题。
答案 0 :(得分:1)
您可以展平数组并减少值。
response.flat().reduce((acc, value) => {
let existingValueIndex = acc.findIndex(obj => obj.topic === value.topic);
if (existingValueIndex === -1) {
acc.push({ ...value });
return acc;
}
acc[existingValueIndex] = {
...acc[existingValueIndex],
...value,
};
return acc;
}, []);
如果阵列很大,效率不是很高。
您还可以使用Set
跟踪主题名称,并防止在数组中搜索每次迭代。
答案 1 :(得分:1)
这是解决此问题的另一种方式,
使用唯一的topic
来使主题成为对象,其中包含每个主题项的属性。
最后使用Object.values()
使其成为数组。
const response = [
[
{
"topic": "Topic 1",
"avgwk38": 5
},
{
"topic": "Topic 2",
"avgwk38": 86
},
{
"topic": "Topic 3",
"avgwk38": 6
}
],
[
{
"topic": "Topic 1",
"avgwk39": 25
},
{
"topic": "Topic 2",
"avgwk39": 32
},
{
"topic": "Topic 3",
"avgwk39": 4
}
]
]
const obj = response.flat().reduce((acc, curr) => {
if(!acc[curr.topic]) {
acc[curr.topic] = {
...curr
}
} else {
acc[curr.topic] = {
...acc[curr.topic],
...curr
}
}
return acc;
}, {});
console.log(Object.values(obj));