如何在angularjs中合并两个对象数组?

Posted

技术标签:

【中文标题】如何在angularjs中合并两个对象数组?【英文标题】:How merge two objects array in angularjs? 【发布时间】:2015-07-09 00:44:36 【问题描述】:

我想在 angulajs 中将以下对象数组附加到现有的对象数组中,以实现加载更多功能。

即,每次都将 AJAX 响应附加到现有的响应中。

我有一个变量,$scope.actions,其中包含以下 JSON 数据,

    
    "total": 13,
    "per_page": 2,
    "current_page": 1,
    "last_page": 7,
    "next_page_url": "http://invoice.local/activities/?page=2",
    "prev_page_url": null,
    "from": 1,
    "to": 2,
    "data": [
        
            "id": 2108,
            "action_type_id": 202,
            "user_id": 1
        ,
        
            "id": 2108,
            "action_type_id": 202,
            "user_id": 1
        
    ]

我想在每次此变量时附加以下JSON 响应。

    
    "data": [
        
            "id": 2108,
            "action_type_id": 202,
            "user_id": 1
        ,
        
            "id": 2108,
            "action_type_id": 202,
            "user_id": 1
        
    ]

我试过$scope.actions.data.concat(data.data);

但它不工作并收到以下错误消息

$scope.actions.data.concat is not a function

【问题讨论】:

Angular 同时拥有复制对象的extendcopy ***.com/questions/19765283/… 由于新变量与第一个示例中的data 属性完全相同,因此进行一些说明会有所帮助 docs.angularjs.org/api/ng/function/angular.copy 【参考方案1】:

你可以使用angular.extend(dest, src1, src2,...);

在你的情况下是:

angular.extend($scope.actions.data, data);

在此处查看文档:

https://docs.angularjs.org/api/ng/function/angular.extend

否则,如果你只从服务器获取新值,你可以这样做

for (var i=0; i<data.length; i++)
    $scope.actions.data.push(data[i]);

【讨论】:

你不能提供更多信息吗? `angular.extend($scope.actions, data);它正在替换不附加:( 尝试第二种方法时,出现错误Error: $scope.actions.data.push is not a function 我认为你应该尝试这样做angular.extend(, $scope.actions.data, data); 。 docs.angularjs.org/api/ng/function/angular.extend。这对我有很大帮助,也对我有用。 angular.extend() 是一个浅拷贝,在一般情况下会失败(任意复杂对象的数组)。 angular.merge() 实现了深拷贝,但在粗略测试期间也失败了......我选择了直接解决方案: src.forEach(function (x) dst.push(x); );将 src 合并到 dst 中。【参考方案2】:

这对我有用:

$scope.array1 = $scope.array1.concat(array2)

在你的情况下是:

$scope.actions.data = $scope.actions.data.concat(data)

【讨论】:

@davidH 如果您只想将两个数组拼凑在一起,这才是正确的答案。如果数组的键只是一个任意索引号,则非常理想。但是,对于问题中的实际示例,每个项目都返回一个特定的 ID,因此在这里合并或扩展更好,以避免结果数组中的重复。 这对我不起作用。我在 ng-repeat 中使用 $scope.actions.data,控制台中的值正在更新,但视图文件中没有。【参考方案3】:
$scope.actions.data.concat is not a function 

和我一样的问题,但我解决了这个问题

 $scope.actions.data = [].concat($scope.actions.data , data)

【讨论】:

【参考方案4】:

简单

var a=[a:4], b=[b:5]

angular.merge(a,b) // [a:4, b:5]

在 Angular 1.4.1 上测试

【讨论】:

与 extend() 不同,merge() 递归地下降到源对象的对象属性中,执行深层复制。

以上是关于如何在angularjs中合并两个对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

2020-12-30 两个数组合并并去重对象

两个数组交叉合并为一个数组

请你告诉我合并两个数组,你有多少种方法

如何将不同数组中的两个匹配对象合并为一个对象?

如何将数组的两个对象合并为一个?

如何在AngularJS中使用http发送两个Array对象?