根据一个键合并多个对象数组

时间:2020-10-13 10:06:33

标签: javascript node.js arrays json object

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

请帮我解决这个问题。

2 个答案:

答案 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));