Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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中合并合并匹配对象的数组_Javascript_Arrays_Angularjs_Merge_Angularjs Scope - Fatal编程技术网

在Javascript中合并合并匹配对象的数组

在Javascript中合并合并匹配对象的数组,javascript,arrays,angularjs,merge,angularjs-scope,Javascript,Arrays,Angularjs,Merge,Angularjs Scope,我在Angular JS中有两个数组对象,我希望合并(重叠/组合)匹配的对象 例如,数组1如下所示: [ {"id":1,"name":"Adam"}, {"id":2,"name":"Smith"}, {"id":3,"name":"Eve"}, {"id":4,"name":"Gary"}, ] [ {"id":1,"name":"Adam", "checked":true}, {"id":3,"name":"Eve", "checked":

我在Angular JS中有两个数组对象,我希望合并(重叠/组合)匹配的对象

例如,数组1如下所示:

[
    {"id":1,"name":"Adam"},
    {"id":2,"name":"Smith"},
    {"id":3,"name":"Eve"},
    {"id":4,"name":"Gary"},
]
[
    {"id":1,"name":"Adam", "checked":true},
    {"id":3,"name":"Eve", "checked":true},
]
[
    {"id":1,"name":"Adam", "checked":true},
    {"id":2,"name":"Smith"},
    {"id":3,"name":"Eve", "checked":true},
    {"id":4,"name":"Gary"},
]
数组2是这样的:

[
    {"id":1,"name":"Adam"},
    {"id":2,"name":"Smith"},
    {"id":3,"name":"Eve"},
    {"id":4,"name":"Gary"},
]
[
    {"id":1,"name":"Adam", "checked":true},
    {"id":3,"name":"Eve", "checked":true},
]
[
    {"id":1,"name":"Adam", "checked":true},
    {"id":2,"name":"Smith"},
    {"id":3,"name":"Eve", "checked":true},
    {"id":4,"name":"Gary"},
]
我希望合并后的结果数组变成这样:

[
    {"id":1,"name":"Adam"},
    {"id":2,"name":"Smith"},
    {"id":3,"name":"Eve"},
    {"id":4,"name":"Gary"},
]
[
    {"id":1,"name":"Adam", "checked":true},
    {"id":3,"name":"Eve", "checked":true},
]
[
    {"id":1,"name":"Adam", "checked":true},
    {"id":2,"name":"Smith"},
    {"id":3,"name":"Eve", "checked":true},
    {"id":4,"name":"Gary"},
]
可能吗?我尝试过angular的
array\u merge
array\u extend
如下:

angular.merge([], $scope.array1, $scope.array2);
angular.extend([], $scope.array1, $scope.array2);
但上述方法重叠数组中的前两个对象,并且不会基于匹配数据合并它们。使用
foreach
循环是唯一的解决方案吗


有人能在这里指导我吗?

不确定AngularJS是否支持此合并查找。我制作了一个片段,其作用完全相同:

函数合并(array1,array2){
var-id=[];
var merge_obj=[];
阵列1.映射(功能(ele){
if(!(id.indexOf(ele.id)>-1)){
id.push(ele.id);
合并对象推送(ele);
}
});
array2.map(函数(ele){
var指数=id.indexOf(ele.id);
如果(!(索引>-1)){
id.push(ele.id);
合并对象推送(ele);
}否则{
合并对象[索引]=ele;
}
});
console.log(合并对象);
}
变量数组1=[{
“id”:1,
“姓名”:“亚当”
}, {
“id”:2,
“姓名”:“史密斯”
}, {
“id”:3,
“姓名”:“夏娃”
}, {
“id”:4,
“姓名”:“加里”
}, ]
变量array2=[{
“id”:1,
“姓名”:“亚当”,
“已检查”:真
}, {
“id”:3,
“姓名”:“夏娃”,
“已检查”:真
}, ];

合并(array1,array2)
真正地说,
扩展
在角度上使用对象而不是数组。但在你的情况下我们可以做些小动作。这是另一个解决方案

// a1, a2 is your arrays
// This is to convert array to object with key is id and value is the array item itself
var a1_ = a1.reduce(function(obj, value) {
    obj[value.id] = value;
    return obj;
}, {});
var a2_ = a2.reduce(function(obj, value) {
    obj[value.id] = value;
    return obj;
}, {});
// Then use extend with those two converted objects
var result = angular.extend([], a1_, a2_).splice(1)
注意事项:

[
    {"id":1,"name":"Adam"},
    {"id":2,"name":"Smith"},
    {"id":3,"name":"Eve"},
    {"id":4,"name":"Gary"},
]
[
    {"id":1,"name":"Adam", "checked":true},
    {"id":3,"name":"Eve", "checked":true},
]
[
    {"id":1,"name":"Adam", "checked":true},
    {"id":2,"name":"Smith"},
    {"id":3,"name":"Eve", "checked":true},
    {"id":4,"name":"Gary"},
]
  • 为了兼容性,
    reduce
    可能不起作用
  • after数组将替换上一个数组。这是因为在Angular中实现了
    extend

你是/会使用下划线还是lodash?不。不熟悉,也不会使用。这看起来很好@AnandSudhanaboina,我可以在我的角度项目中使用,这似乎是一个很好的方法。非常感谢你。我现在就试试看。:)嗨@AnandSudhanaboina我在我的应用程序中测试了它,效果很好。但是,唯一的问题是,它通过将匹配的对象放在顶部,其余的放在底部,从而改变了结果的顺序。是否可以使用合并的数据保持与数组1相同的顺序?更新了答案。如果这个方法有效,请做标记作为答案。谢谢。那太完美了,它的工作原理和我想要的完全一样。非常感谢@AnandSudhanaboina