使用underscore.js如何从数组中移除多个元素?

4
我有这个:

我有这个:

var arrA = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

我有另一个数组:

var arrB = [{id:1,other:'c'},{id:3,other:'d'}];

我可以使用underscore.js如何从arrA中删除具有与arrB相同id属性的项目?
期望的结果应该是:
arrA = [{id:2, name:'b'}];

感谢您的选择,


必须使用underscoreJS吗? - Fatih TAN
JavaScript会太混乱了。你有其他的库吗?Lodash也可以。 - Vicheanak
我只有JavaScript的解决方案。 - Fatih TAN
好的,让我们在评论区发布一个 Plunkr 或 JSFiddle。不要发布答案,因为那可能会被踩,这不是回答问题。感谢您的贡献。 - Vicheanak
这是链接。检查浏览器控制台以查看结果。https://jsfiddle.net/y9tsee7g/ - Fatih TAN
5个回答

6
使用 Array#filterArray#findIndex
var output = arrA.filter((el) => {
  return arrB.findIndex((elem) => {
    return elem.id == el.id;
  }) == -1;
});

一句话总结:

arrA.filter((el) => (arrB.findIndex((elem) => (elem.id == el.id)) == -1));

var arrA = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}];


var arrB = [{
  id: 1,
  other: 'c'
}, {
  id: 3,
  other: 'd'
}];

var op = arrA.filter(function(el) {
  return arrB.findIndex(function(elem) {
    return elem.id == el.id;
  }) == -1;
});
console.log(op);

Or using Array#find

var arrA = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}];


var arrB = [{
  id: 1,
  other: 'c'
}, {
  id: 3,
  other: 'd'
}];

var op = arrA.filter(function(el) {
  return !arrB.find(function(elem) {
    return elem.id == el.id;
  });
});
console.log(op);


1

var arrA = [{id:1,name:'a'}, {id:2,name:'b'}, {id:3,name:'c'}];
var arrB = [{id:1,other:'c'}, {id:3,other:'d'}];

var res = arrB.reduce((acc, b) => {
  return acc.filter(({id}) => id !== b.id);
}, arrA);

// [{id:2,name:'b'}]
console.log(res);


1
在纯JavaScript中,您可以使用forEach()循环和splice()来删除对象,如果它的id在其他数组中找到。

var arrA = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
var arrB = [{id:1,other:'c'},{id:3,other:'d'}];

var b = arrB.map(e => e.id);

arrA.forEach(function(e, i) {
  if(b.indexOf(e.id) != -1) arrA.splice(i, 1);
});

console.log(arrA);


1
像这样
var arrA = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
var arrB = [{id:1,other:'c'},{id:3,other:'d'}];
var keys = _.keys(_.indexBy(arrB, "id"));
var result = _.filter(arrA, function(v) {
   return !_.contains(keys, v.id.toString());
});
console.log(result)

希望这可以帮助到您。

0

听起来你想要差异,但不幸的是这对于对象不起作用。相反,你可以尝试这个:

arrA = _.filter(arrA, function(obj){
           return !_.findWhere(arrB, {id: obj.id});
       });

您可以使用内置的filterfind函数来完成此操作,而无需使用下划线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接