繁体   English   中英

基于一个键合并多个对象数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM