合并Arrays在Angular Javascript中组合匹配对象

时间:2015-09-15 06:24:55

标签: javascript arrays angularjs merge angularjs-scope

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

例如,数组1是这样的:

[
    {"id":1,"name":"Adam"},
    {"id":2,"name":"Smith"},
    {"id":3,"name":"Eve"},
    {"id":4,"name":"Gary"},
]

数组2是这样的:

[
    {"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"},
]

这可能吗?我试过像array_mergearray_extend这样的角色:

angular.merge([], $scope.array1, $scope.array2);
angular.extend([], $scope.array1, $scope.array2);

但是上面的方法与数组中的前两个对象重叠,并且不会根据匹配数据合并它们。有一个foreach循环是唯一的解决方案吗?

有人可以指导我吗?

2 个答案:

答案 0 :(得分:1)

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



function merge(array1, array2) {
    var ids = [];
    var merge_obj = [];

    array1.map(function(ele) {
        if (!(ids.indexOf(ele.id) > -1)) {
            ids.push(ele.id);
            merge_obj.push(ele);
        }
    });

    array2.map(function(ele) {
    	var index = ids.indexOf(ele.id);
        if (!( index > -1)) {
            ids.push(ele.id);
            merge_obj.push(ele);
        }else{
        	merge_obj[index] = ele;
        }
    });

    console.log(merge_obj);
}

var array1 = [{
    "id": 1,
    "name": "Adam"
}, {
    "id": 2,
    "name": "Smith"
}, {
    "id": 3,
    "name": "Eve"
}, {
    "id": 4,
    "name": "Gary"
}, ]

var array2 = [{
    "id": 1,
    "name": "Adam",
    "checked": true
}, {
    "id": 3,
    "name": "Eve",
    "checked": true
}, ];

merge(array1, array2);




答案 1 :(得分:1)

正确地说,Angular中的extend使用object而不是array。但是我们可以在你的情况下做小动作。这是另一种解决方案。

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

备注:

  • 为了兼容性,reduce可能无效。
  • after数组将替换前一个数组。这是因为在Angular中实现了extend