如何使用Lodash根据ID数组移除对象数组中的指定元素?
解决方案:用Lodash移除匹配ID数组的对象
嘿,这个需求其实很好实现,别被“单一条件”的说法框住——_.remove的回调函数完全支持自定义判断逻辑,只要返回布尔值就行!咱们直接结合集合判断来搞定:
基础实现(直接用数组includes)
如果待移除的ID数量不多,直接用数组的includes方法就能快速完成判断:
var a = [ {id: 1, name: 'A'}, {id: 2, name: 'B'}, {id: 3, name: 'C'}, {id: 4, name: 'D'} ]; var removeItem = [1,2]; // 用_.remove遍历数组,移除id在removeItem里的元素 _.remove(a, item => removeItem.includes(item.id)); console.log(a); // 输出:[{id: 3, name: 'C'}, {id: 4, name: 'D'}]
性能优化版(用Set提升查找效率)
如果待移除的ID数量较多,数组includes的查找效率是O(n),建议把removeItem转成Set,查找速度会直接提升到O(1):
var a = [ {id: 1, name: 'A'}, {id: 2, name: 'B'}, {id: 3, name: 'C'}, {id: 4, name: 'D'} ]; var removeItem = [1,2]; // 转成Set优化查找性能 var removeIds = new Set(removeItem); _.remove(a, item => removeIds.has(item.id)); console.log(a); // 同样得到目标结果
不修改原数组的方案(用_.filter)
如果不想直接修改原数组a,可以用_.filter生成新数组,原数组保持不变:
var a = [ {id: 1, name: 'A'}, {id: 2, name: 'B'}, {id: 3, name: 'C'}, {id: 4, name: 'D'} ]; var removeItem = [1,2]; var removeIds = new Set(removeItem); // 过滤出不在移除列表里的元素,生成新数组 var filteredArray = _.filter(a, item => !removeIds.has(item.id)); console.log(filteredArray); // 新数组:[{id: 3, name: 'C'}, {id: 4, name: 'D'}] console.log(a); // 原数组保持不变
简单来说,_.remove的回调函数完全支持复杂判断,只要在里面检查当前对象的ID是否属于待移除列表就行啦~
内容的提问来源于stack exchange,提问作者Gitesh Purbia
相关产品推荐
相关产品推荐

