You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从含数组、对象的混合数组判断值存在并修复_.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:18:00