在javascript中从对象数组中删除对象

时间:2014-04-16 20:34:51

标签: javascript underscore.js

我正在尝试使用从服务器获取的增量数据从对象数组中删除对象。我在我的项目中使用下划线。

是否有直接的方法来执行此操作,而不是使用循环和分配?

主阵列

var input = [
   {name: "AAA", id: 845,status:1},
   {name: "BBB", id: 839,status:1},
   {name: "CCC", id: 854,status:1}
];

Tobe删除

var deltadata = [
   {name: "AAA", id: 845,status:0},
   {name: "BBB", id: 839,status:0}
];

预期输出

var finaldata =  [
  {name: "CCC", id: 854,status:1}
]

3 个答案:

答案 0 :(得分:2)

试试这个

var finaldata = _.filter(input, function(item) {
    return !(_.findWhere(deltadata, {id: item.id}));
});

它确实假设您拥有唯一的ID。也许你可以想出更好的东西。

答案 1 :(得分:1)

一个简单的filter会这样做:

var finaldata = _.filter(input, function(o) {
    return _.findWhere(deltadata, o) === undefined;
});

findWhere更有效率的是创建一个包含要移除的ID的查找地图,然后通过它进行过滤:

var idsToRemove = _.reduce(deltadata, function(m, o) {
    m[o.id] = true;
    return m;
}, {});
var finaldata = _.reject(input, function(o) { return o.id in idsToRemove; });

答案 2 :(得分:1)

这是一个简单的解决方案。正如其他人所提到的,如果没有循环,我认为这是不可能的。您还可以在条件中添加状态和名称检查,因为这只是比较ID。

var finaldata = input.filter(function(o) {
    for (var i = 0; i < deltadata.length; i++)
       if (deltadata[i].id === o.id) return false;
    return true;
});