Javascript 如何按属性值从数组中删除对象?

Javascript 如何按属性值从数组中删除对象?,javascript,Javascript,我有以下javascript对象: var arr1 = [{id:'124',name:'qqq'}, {id:'589',name:'www'}, {id:'45',name:'eee'}, {id:'567',name:'rrr'}] var arr2 = [{id:'124',name:'ttt'}, {id:'45',name:'yyy'} 从arr1中,我需要删除arr2中具有相同id的

我有以下javascript对象:

var arr1 = [{id:'124',name:'qqq'}, 
           {id:'589',name:'www'}, 
           {id:'45',name:'eee'},
           {id:'567',name:'rrr'}]

var arr2 = [{id:'124',name:'ttt'}, 
           {id:'45',name:'yyy'}
从arr1中,我需要删除arr2中具有相同id的所有对象

以下是arr1的预期结果:

var arr1 = [{id:'589',name:'www'}, 
           {id:'567',name:'rrr'}]

在Javascript中实现它的优雅方式是什么?

我会在
arr2
中获得所有ID的压缩列表,然后使用
indexOf
find
过滤器
中排除修订后的
arr1

var arr1=[{
id:'124',
名称:“qqq”
}, {
id:'589',
名称:“www”
}, {
id:'45',
姓名:'eee'
}, {
id:'567',
名称:'rrr'
}];
var arr2=[{
id:'124',
名称:'ttt'
}, {
id:'45',
名称:“yyy”
}];
var id=arr2.map(函数(it){
将其返回.id;
});
var unique=arr1.filter(函数(it){
返回id.indexOf(it.id)==-1;//不包含
});

console.log(唯一)我强烈建议使用它进行此类对象操作。发件人:

如果要在对象上执行相同的操作:

_.filter({"a":1,"b":2,"c":3,"d":4}, function(value,key){ return value % 2 == 0; })
在您的具体情况下,这将是解决方案:

var newArray = _.filter(arr1,(object1) => {
    return !_.contains(_.pluck(arr2,'id'),object1.id);
});
此图表显示了下划线和Lodash对本机方法的改进:

特别是在过滤器上,它显示了超过20%的改进。
摘自

以下是一种动态获取ID值的方法。它通过
过滤器
将中间对象绑定到此

var arr1=[{id:'124',name:'qqq'},
{id:'589',name:'www'},
{id:'45',name:'eee'},
{id:'567',name:'rrr'}];
var arr2=[{id:'124',name:'ttt'},
{id:'45',name:'yyy'}];
arr1=arr1.滤波器(功能(el){
返回!这个[el.id];
},arr2.减少(功能(obj,el){
返回obj[el.id]=1,obj;
}, {}));

控制台日志(arr1)我建议对此使用哈希表

var arr1=[{id:'124',name:'qqq'},{id:'589',name:'www'},{id:'45',name:'eee'},{id:'567',name:'rrr'}],
arr2=[{id:'124',name:'ttt'},{id:'45',name:'yyy'}];
arr1=arr1.过滤器(功能(a){
返回!这个[a.id];
},函数(散列){
arr2.forEach(函数(a){hash[a.id]=true;});
返回散列;
}(Object.create(null));

控制台日志(arr1)for循环可以执行
arr1[i]。id==arr2[j]。id?delete(arr1[i]):null
这些行中的某些内容将执行您想要执行的操作need@AkshayKhandelwal你能推荐的最糟糕的东西,糟糕的是它甚至被提升了。OP不使用删除运算符,这是错误的。无论是find+splice还是filter-都应该这样做。我明白OP想要什么,但是再一次:delete操作符永远不应该用于数组。这会产生不必要的副作用。@AkshayKhandelwal
过滤器是正确的解决方案,不会从数组中删除随机元素。是否可以在单行中创建它?@Michael是的,提前选择ID只是一种优化。我将添加另一个选项。由于
Array
具有可链接的函数方法,下划线在很大程度上是超级的。本机的
过滤器
可以很好地解决这个问题,无需添加另一个(几乎相同的)
过滤器
。众所周知,下划线JS比javascript本机方法更高效,而且更干净。实际上,为了提高效率,我建议使用lodash。@NicolaPedretti“underline.js比javascript本机方法要[…]高效得多”:坐下来想想下划线是如何实现的,即它是用哪种语言编写的。然后看看你的陈述怎么可能永远不会是真的。在显示下划线vs lodash的基础上,显示了对本机方法的改进。下划线是用javascript实现的,这并不意味着它使用内置的方法…不需要绑定,只需将
这个
放在原处。@NinaScholz,这确实节省了几个字符:adapted。谢谢请注意,
不是由箭头函数中的
thisArg
确定的。
var newArray = _.filter(arr1,(object1) => {
    return !_.contains(_.pluck(arr2,'id'),object1.id);
});