Lodash通过匹配ids数组从数组中删除对象

时间:2018-01-03 12:09:31

标签: javascript arrays lodash

我有一系列对象,如:

var a = [
  {id: 1, name: 'A'},
  {id: 2, name: 'B'},
  {id: 3,  name: 'C'},
  {id: 4, name: 'D'}
];

我要从数组中删除的Ids数组:

var removeItem = [1,2];

我想通过匹配array a包含的ID来从removeItem array中删除对象。我怎样才能用lodash实现。

我检查了lodash的_.remove方法,但这需要一个特定的条件来从数组中删除一个项目。但我有我要删除的ID列表。

2 个答案:

答案 0 :(得分:6)

正如您所提到的,您需要_.remove方法,并且您提到的具体条件是removeItem数组是否包含数组的已检查元素的id

var removeElements = _.remove(a, obj => removeItem.includes(obj.id));
// you only need to assign the result if you want to do something with the removed elements.
// the a variable now holds the remaining array

答案 1 :(得分:3)

您必须将predicate函数从.remove传递给lodash方法。

var final = _.remove(a, obj => removeItem.indexOf(obj.id) > -1);

使用indexOf方法。

  

indexOf()方法返回给定元素的第一个索引   可以在数组中找到,如果不存在,则返回-1。

您可以使用native javascript使用filter方法执行此操作,该方法接受回调功能作为参数。

var a = [
  {id: 1, name: 'A'},
  {id: 2, name: 'B'},
  {id: 3,  name: 'C'},
  {id: 4, name: 'D'}
];
var removeItem = [1,2];
a = a.filter(function(item){ 
   return removeItem.indexOf( item.id ) == -1; 
});
console.log(a);

filter方法只是通过应用回调函数创建一个新数组。

来自文档

  

filter()方法创建一个包含所有传递元素的新数组   由提供的函数实现的测试。

如果要使用splice方法修改原始数组。

var a = [
  {id: 1, name: 'A'},
  {id: 2, name: 'B'},
  {id: 3,  name: 'C'},
  {id: 4, name: 'D'}
];
var removeItem = [1,2];
removeItem.forEach(function(id){
   var itemIndex = a.findIndex(i => i.id == id);
   a.splice(itemIndex,1);
});
console.log(a);