【问题标题】:Merge multiple array of objects based on a key基于键合并多个对象数组
【发布时间】:2021-01-27 16:00:48
【问题描述】:

我需要通过一个键合并一个对象数组列表。我试图在网上找到材料,但最终只合并了 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
    }
]

请帮我解决这个问题。

【问题讨论】:

标签: javascript node.js arrays json object


【解决方案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 来跟踪主题名称并防止在数组中搜索每次迭代。

【讨论】:

  • 谢谢@PAG,这就像一个魅力。我只有小数组,因为这是一个包含每周平均值的月度视图。
【解决方案2】:

这是解决此问题的另一种方法,
使用唯一的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));

【讨论】:

  • 谢谢队友@zb22。扩展运算符是 JS 的超能力
猜你喜欢
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 2022-12-18
  • 2021-09-19
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多