Javascript Lodash合并数组并处理重复项
我有两个阵列:Javascript Lodash合并数组并处理重复项,javascript,lodash,Javascript,Lodash,我有两个阵列: var a = [ {aId: 1, name: "a1"}, {aId: 2, name: "a2"} ]; var b = [ {parentId: 1, description: "b1"}, {parentId: 1, description: "b2"}, {parentId: 2, description: "b3"} ]; 我想基于parentId==aId合并这些数组 我做到了: var c = _.map(a, f
var a = [
{aId: 1, name: "a1"},
{aId: 2, name: "a2"}
];
var b = [
{parentId: 1, description: "b1"},
{parentId: 1, description: "b2"},
{parentId: 2, description: "b3"}
];
我想基于parentId==aId合并这些数组
我做到了:
var c = _.map(a, function(obj) {
return _.assign(obj, _.find(b, {parentId: obj.aId}));
})
这就像预期的那样工作,但我需要它来处理重复项-当它找到匹配项时,它会正确地合并它,但我需要它将合并推送到一个新属性中,而不是合并
我得到的是:
[
{aId: 1, name: "a1", description: "b1"},
{aId: 2, name: "a2", description: "b3"}
]
我想要的是:
[
{
aId: 1,
name: "a1",
b: [
{parentId: 1, description: "b1"},
{parentId: 1, description: "b2"}
]
},
{
aId: 2,
name: "a2",
b: [
{parentId: 2, description: "b1"}
]
}
]
公共属性当然可以省略 编辑
虽然这个答案非常有用,并且在一定程度上满足了最初的问题,但也有一些关于注释中的突变的讨论,这可能会导致意外行为,例如在使用redux或其他依赖于不可变状态的库时
原始答案使用了导致突变的。下面使用es6 spreads操作符将新对象返回到新数组中
const a = [{aId: 1, name: "a1"}, {aId: 2, name: "a2"}];
const b = [{parentId: 1, description: "b1"}, {parentId: 1, description: "b2"}, {parentId: 2, description: "b3"}];
const c = _.map(a, (obj) =>
({ ...obj, ...{ b: _.filter(b, {parentId: obj.aId}) }});
console.log('mimick original', c);
原始答复:
你的代码几乎完成了;在中,可以传递属性b
等于结果的对象,而不是:
注意,返回匹配的元素,否则未定义,并返回新的过滤数组
代码:
var a=[{aId:1,名称:“a1”},{aId:2,名称:“a2”}],
b=[{parentId:1,description:“b1”},{parentId:1,description:“b2”},{parentId:2,description:“b3”}];
_.地图(a,功能(obj){
返回分配(对象{
b:uz.filter(b,{parentId:obj.aId})
});
});
控制台日志(a)代码>
。作为控制台包装{最大高度:100%!重要;顶部:0;}
使用\.filter
而不是\.find
,这样您就可以将所有匹配的结果放入一个数组中,并相应地更新映射。谢谢,trickIt这么做了。映射似乎已经修改了原始数组,不需要cI认为是赋值操作导致了变异,可以用es6 spread替换吗?@bigmadwolf是的,当然可以,您可以编辑答案。。这将是受欢迎的。提前谢谢
{
b: _.filter(b, {parentId: obj.aId})
}