【问题标题】:Filter array of objects remove duplicates by property [AngularJS]过滤对象数组按属性删除重复项[AngularJS]
【发布时间】:2015-10-11 15:52:03
【问题描述】:

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

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

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

$scope.notys.push(data);

每个data 都有唯一的id 属性data.id

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

所以我需要这样做:

  1. 从 ajax 获取 data

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

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

【问题讨论】:

  • 我的猜测是您必须手动执行此操作:在推送新数据对象之前,请检查它是否已存在于您的列表中。如果是:更新条目,如果不是:推送新数据。
  • 如何检查是否已经存在?
  • 你可能想看看像下划线这样的库,它可以帮助你做这些数组操作
  • 如果我正确理解了您的问题,这里之前已经解决了这个问题。看看这个答案stackoverflow.com/questions/23881580/…
  • 试用库 js-data ... 将通过非常简单的 api 和许多强大的功能为您处理所有这些

标签: javascript arrays angularjs


【解决方案1】:

您可以使用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));

【讨论】:

  • 你能给我举个例子吗?
【解决方案2】:

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

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

如果元素存在相同的 id,我首先删除元素,然后推送新元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 2017-06-09
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2016-05-15
    相关资源
    最近更新 更多