[英]Merge multiple array of objects based on a key
我需要通过一个键合并一个对象数组列表。 我试图在网上找到材料,但最终只合并了 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
}
]
请帮我解决这个问题。
您可以展平数组并减少值。
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
来跟踪主题名称并防止在每次迭代时在数组中搜索。
这是解决这个问题的另一种方法,
使用唯一的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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.