在Javascript中合并合并匹配对象的数组
我在Angular JS中有两个数组对象,我希望合并(重叠/组合)匹配的对象 例如,数组1如下所示:在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":
[
{"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