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
相关产品推荐
相关产品推荐

