使用 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);
我看这种方法太久了,答案可能很明显,但我正在尝试组合一些对象数组。 给定 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);