如何使用Lodash验证子数组是否存在于父数组中?
问题分析与解决方案
你遇到的这个问题,核心原因是JavaScript里数组属于引用类型——哪怕两个数组内容完全一样,它们也是不同的内存引用,而Lodash的_.includes、_.find、_.findIndex默认采用严格相等(===)来匹配元素,所以直接传el是匹配不到的。
举个直观的例子就能明白:
[1] === [1] // false,因为是两个独立的内存引用
下面给你几个可行的解决方法:
方法1:用_.some配合_.isEqual做深度匹配
_.isEqual是Lodash专门用来做深度相等比较的方法,能准确判断两个数组/对象的内容是否一致,结合_.some可以快速检查父数组中是否存在匹配的子数组:
let arr = [[1],[2],[3]]; let el = [1]; _.some(arr, item => _.isEqual(item, el)); // 返回true
方法2:给_.find/_.findIndex传入自定义比较函数
原来直接传el会让Lodash用严格相等去匹配,改成传入一个自定义比较函数,用_.isEqual判断内容即可:
// 使用_.find找到匹配的子数组 _.find(arr, item => _.isEqual(item, el)); // 返回[1] // 使用_.findIndex找到匹配元素的下标 _.findIndex(arr, item => _.isEqual(item, el)); // 返回0
补充:为什么原来的写法会失败?
再回顾你最初的代码:
let arr = [[1],[2],[3]]; let el = [1]; _.includes(arr, el) // false _.find(arr, el) // undefined _.findIndex(arr, el) // -1
当你把el作为第二个参数传给这些方法时,Lodash会默认用===去匹配数组元素,而el和arr里的[1]是两个不同的引用,自然匹配失败。
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

