Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Lodash合并数组并处理重复项_Javascript_Lodash - Fatal编程技术网

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})
}