过滤器对象数组按属性[AngularJS]

时间:2015-10-11 15:52:04

标签: javascript arrays angularjs

我的控制器中有$scope.notys数组ng-repeat

<li ng-repeat="x in notys" class="item js-item">
...

从我的控制器中我将数据推送到这样的数组:

$scope.notys.push(data);

每个data都有唯一标识属性data.id

问题是如何更新/替换属性与来自ajax的最后data.id相同的对象?

所以我需要做这样的事情:

  1. 从ajax获取data

  2. 现在从ajax获得data.id我需要检查$scope.notys是否存在具有相同data.id的对象

  3. 如果存在,则将其替换为最后一个数据,如果不存在,则只替换push数据

2 个答案:

答案 0 :(得分:0)

您可以使用array.reduce将数组缩减为键值对(id-index)。如果id作为键存在,那么您可以轻松获得索引。然后,您可以array.splice使用该索引来拼接旧的并放入新的。

var arr = [{id:1, value:'foo'},{id:2, value:'bar'}]
var idIndexMap = arr.reduce(function(carry, item){
  carry[item.id] = item.value;
  return carry;
}, {});

var newItem = {id:1, value: 'baz'};
var indexOfExisting = idIndexMap[newItem.id];

if(indexOfExisting !== undefined) arr.splice(indexOfExisting, 1, newItem);

document.write(JSON.stringify(arr));

答案 1 :(得分:0)

我找到了这个简单的解决方案:

angular.forEach($scope.notys, function (value, key) {
    if(value.id === data.id) $scope.notys.splice(key,1);
});
$scope.notys.push(data);

首先,如果元素存在具有相同的id,则删除元素,然后按下新元素。