javascript - 合并数组中具有相同id的对象

标签 javascript ecmascript-6

我想我有一个非常简单的问题,但仍然没有找到解决方案。我有一个如下所示的数组:

var originalArray = [{
  id: 1,
  elements: [1, 2]
},
{
  id: 1,
  elements: [3, 4]
},
{
  id: 5,
  elements: ['a', 'b']
},
{
  id: 5,
  elements: ['c', 'd']
}, {
  id: 27,
  elements: []
}]

我想将其修改为如下所示(按 id 合并并加入元素):
newArray = [{
  id: 1,
  elements: [1, 2, 3, 4]
}, {
  id: 5,
  elements: ['a', 'b', 'c', 'd']
}, {
  id: 27,
  elements: []
}]

我已经进行了多次尝试,但仍然没有找到一种优雅的方式。

最佳答案

您可以创建一个以 ID 为键的对象并将具有相同 ID 的元素推送给它们,然后转换回数组。对于更大的数组,这比在每次迭代中循环更有效:

var originalArray = [{
  id: 1,
  elements: [1, 2]
},
{
  id: 1,
  elements: [3, 4]
},
{
  id: 5,
  elements: ['a', 'b']
},
{
  id: 5,
  elements: ['c', 'd']
}, {
  id: 27,
  elements: []
}];

const arrayHashmap = originalArray.reduce((obj, item) => {
  obj[item.id] ? obj[item.id].elements.push(...item.elements) : (obj[item.id] = { ...item });
  return obj;
}, {});

const mergedArray = Object.values(arrayHashmap);

console.log(mergedArray);

关于javascript - 合并数组中具有相同id的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58692417/

相关文章:

javascript - window.onbeforeunload 与表单

javascript - Chrome/V8如何处理javascript中的大对象?

javascript - 在调用 api 函数之前等待内部指令编译

javascript - 如果我可以通过这个调用父方法那么为什么要在 ES6 中使用 super 呢?

javascript - 防止 ES6 promise 吞下错误(不使用 .catch)

javascript - 文本区域上的 TinyMCE : text between tags is not shown

javascript - 在 Codepen 项目中使用 Javascript ES6 导入和导出功能

javascript - If 语句内嵌套 For of 循环仅保留最后一个值

lodash "set"方法的 javascript 实现

javascript - 带有 ES6 模块的命名空间