使用Lodash的without函数按属性排除数组对象未生效,求原因及解决方法
问题分析与解决方案
嘿,这个问题我之前也踩过坑!问题出在Lodash _.without() 函数的底层逻辑上,咱们来理清楚:
为什么你的代码没生效?
_.without() 是通过严格相等运算符(===)来判断是否要排除元素的。而对象属于引用类型——你在调用时传入的 {code: '002'} 是一个全新的对象,和数组里那个 code 为'002'的对象,虽然属性值一样,但内存引用完全不同,所以 === 判断永远返回false,自然没法排除目标元素。
正确的解决方法
处理对象数组的筛选/排除,推荐用Lodash专门为这类场景设计的函数:
方法1:用 _.reject()(最直观)
_.reject() 就是用来返回所有不满足条件的元素,直接用对象匹配属性非常方便:
let arr = [ {code: '001', data: 'foo data 1'}, {code: '002', data: 'foo data 2'}, {code: '003', data: 'foo data 3'}, {code: '004', data: 'foo data 4'} ]; const filteredArr = _.reject(arr, { code: '002' }); console.log(filteredArr); // 输出排除了code=002的3个元素
方法2:用 _.filter() 反向筛选
如果习惯用“筛选符合条件的元素”的思路,也可以反过来写:
// 直接写判断逻辑 const filteredArr = _.filter(arr, item => item.code !== '002'); // 或者用Lodash的工具函数组合 const filteredArr = _.filter(arr, _.negate(_.matchesProperty('code', '002')));
方法3:(不推荐)拿到原对象引用再用_.without()
如果一定要用_.without(),你需要先找到数组里目标对象的原引用,再传入函数:
const targetItem = arr.find(item => item.code === '002'); const filteredArr = _.without(arr, targetItem);
这种方式局限性很大,只有当你能拿到原对象引用时才有效,不如前两种方法灵活。
总结
_.without() 更适合处理基本类型数组(字符串、数字、布尔值),当处理对象数组时,优先用 _.reject() 或 _.filter() 来基于属性做筛选,这才是Lodash设计这些函数的初衷~
内容的提问来源于stack exchange,提问作者Joe Grizz
相关产品推荐
相关产品推荐

