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

Lodash isEqual方法判断不同Map返回true的异常问题咨询

为什么Lodash的_.isEqual会判定两个键值对完全不同的Map相等?

嘿,这个问题我之前也踩过坑,一开始差点怀疑自己对Map的理解错了!让我给你捋清楚到底是怎么回事:

问题根源

你遇到的是Lodash旧版本(4.17.20及更早)中的一个逻辑bug:在对比Map对象时,_.isEqual会错误地将每个键值对(也就是[key, value]数组)内部的元素排序,然后再对比整个entries集合是否一致。

拿你的代码举例:

  • car的entries是[['100','200']],单个键值对排序后变成['100','200']
  • bike的entries是[['200','100']],单个键值对排序后也变成['100','200']

因为Lodash认为这两个排序后的entries集合是完全一致的,所以返回了true——但这显然不符合我们对Map相等性的预期,毕竟两个Map的键和值完全是颠倒的,实际取值结果天差地别。

解决办法

有两个靠谱的方案可以解决这个问题:

1. 升级Lodash版本

这个bug在Lodash 4.17.21版本已经被修复了。升级之后,_.isEqual会正确对比Map的键值对:它会先检查两个Map的大小是否一致,然后逐个验证每个键对应的取值是否完全匹配,不会再对单个键值对内部做排序操作。

2. 手动实现Map相等检查(无法升级时)

如果因为项目限制没法升级Lodash,你可以自己写一个简单的函数来判断两个Map是否相等:

function mapsAreEqual(mapA, mapB) {
  // 先判断大小是否一致,大小不同直接不相等
  if (mapA.size !== mapB.size) return false;
  
  // 遍历第一个Map的所有键值对,检查第二个Map是否有相同键且值相等
  for (const [key, value] of mapA) {
    const mapBValue = mapB.get(key);
    if (!mapB.has(key) || mapBValue !== value) {
      return false;
    }
  }
  
  return true;
}

// 测试一下你的例子:
const car = new Map([['100','200']]);
const bike = new Map([['200','100']]);
console.log(mapsAreEqual(car, bike)); // false,符合预期

这个函数的逻辑更符合我们对Map相等性的认知:只有当两个Map包含完全相同的键,且每个键对应的值都相等时,才判定为相等。

内容的提问来源于stack exchange,提问作者suchcodemuchwow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:28:08