我正在尝试使用从服务器获取的增量数据从对象数组中删除对象。我在我的项目中使用下划线。
是否有直接的方法来执行此操作,而不是使用循环和分配?
主阵列
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}
]
答案 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;
});