如何从含数组、对象的混合数组判断值存在并修复_.some误判问题
解决方案
你当前的写法逻辑本身是正确的,_.isEqual 本身支持数组、对象的深度值对比,出现数组判断始终返回true的问题可按以下步骤排查和修复:
问题排查
- 首先确认你引入的是完整版本的lodash,如果只引入了部分方法包、或者使用了有bug的低版本lodash,会导致
_.isEqual深度对比失效。 - 打印
newVal和points数组的实际值,确认你认为值不等的数组是否确实存在元素完全相等的情况。
以下是可正常运行的验证代码,你可以复制到本地测试验证lodash是否正常工作:
const _ = require('lodash'); let points = [ [1,2,3,4], {a:1, b:2} ] // 测试值相同的数组,返回true let newVal1 = [1,2,3,4] console.log(_.some(points, val => _.isEqual(val, newVal1))) // 测试值不同的数组,返回false let newVal2 = [1,2,3,5] console.log(_.some(points, val => _.isEqual(val, newVal2))) // 测试值相同的对象,返回true let newVal3 = {a:1, b:2} console.log(_.some(points, val => _.isEqual(val, newVal3))) // 测试值不同的对象,返回false let newVal4 = {a:2, b:5} console.log(_.some(points, val => _.isEqual(val, newVal4)))
原生JS替代方案(无需依赖lodash)
如果不想引入lodash,可以自己实现深度对比方法,逻辑如下:
function deepEqual(a, b) { // 类型不一致直接返回false if (typeof a !== typeof b) return false; // 处理基础类型和null if (a === null || typeof a !== 'object') return a === b; // 处理数组对比 if (Array.isArray(a) && Array.isArray(b)) { if (a.length !== b.length) return false; return a.every((item, index) => deepEqual(item, b[index])); } // 处理普通对象对比 if (!Array.isArray(a) && !Array.isArray(b)) { const keysA = Object.keys(a); const keysB = Object.keys(b); if (keysA.length !== keysB.length) return false; return keysA.every(key => deepEqual(a[key], b[key])); } // 一个是数组一个是对象直接返回false return false; } // 业务逻辑调用 const isExist = points.some(val => deepEqual(val, newVal)); if (!isExist) { points.push(newVal) }
内容的提问来源于stack exchange,提问作者Vikas Acharya
相关产品推荐
相关产品推荐

