使用 underscore.js 从数组中删除多个项目?

Remove Multiple Items from Array using underscore.js?

我有这个:

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'}];

谢谢,

Using Array#filter and Array#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);

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

像这样

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)

希望对您有所帮助。

在纯 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);

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

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

您可以使用内置的 filterfind 函数在没有下划线的情况下执行此操作。

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);