使用 Lodash(或 vanilla JS)对集合中的字段进行重复数据删除和合并

Dedupe and merge fields in a collection with Lodash (or vanilla JS)

我看这种方法太久了,答案可能很明显,但我正在尝试组合一些对象数组。 给定 2 个对象数组,我需要根据名称字段对它们进行重复数据删除,但结合操作数组:

var map1 = [{
    name: 'FOO',
    actions: [{bar: 'bar1'}]
}, {
    name: 'FOO2',
    actions: [{bar: 'bar2'}]
}]
var map2 = [{
    name: 'FOO',
    actions: [{bar: 'bar3'}]
}]

所需的输出将是:

[
    {
        name: 'FOO',
        actions: [{bar: 'bar1'}, {bar: 'bar3'}] //merged by name "FOO"
    },
    {
        name: 'FOO2',
        actions: [{bar: 'bar2'}]
    }
]

这是一个 vanillaJS 方法。请注意,您的原始对象的语法错误已在此处更正。

您可以使用 reduce 按键跟踪数组,以便能够使用 [...] 展开语法添加到它们的操作数组中。因为我们最后想要一个数组,而不是一个对象,所以整个结果通过Object.values

传递

let map1 = [{
  name: 'FOO',
  actions: [{
    bar: 'bar1'
  }]
}, {
  name: 'FOO2',
  actions: [{
    bar: 'bar2'
  }]
}]
let map2 = [{
  name: 'FOO',
  actions: [{
    bar: 'bar3'
  }]
}]

let result = Object.values([...map1, ...map2].reduce((b, a) => {
  if (b.hasOwnProperty(a.name)) b[a.name].actions = [...b[a.name].actions, ...a.actions];
  else b[a.name] = a;
  return b;
}, {}))

console.log(result);