这里是一些示例 Javascript (ES6) 代码,它们并不像人们凭直觉想象的那样。
const exampleMap = new Map([[{a: 1}, 2]]);
console.log(exampleMap.get({a: 1}));
事实证明,这会打印出 undefined
。为什么?推理包含在 this StackOverflow answer 中。 .每the MDN entry for Map , Map
使用 ===
进行键相等。并且,根据 the MDN entry for ===
, Object
通过引用相等性进行比较。
一切都很好。它完全按照文档所说的去做。不幸的是,上面的代码试图做的事情非常有用,即使它不是规范中的实际行为。
我如何使用 Map
,或者我应该使用什么来代替 Map
,以获得键值查找,其中键通过对象深度相等语义进行比较?
最佳答案
您可以创建自己的函数,在其中传递要获取其值的映射 (m
) 以及要在其中搜索的 key
map 。然后你可以将你的键字符串化,这样你就可以在你的 map 中搜索键并将它们与这个字符串化的键进行比较
const exampleMap = new Map([[{a: 1}, 2]]);
const getMapVal = (m, key) => {
const strKey = JSON.stringify(key);
return m.get(Array.from(m.keys()).find((k) => JSON.stringify(k) === strKey));
}
console.log(getMapVal(exampleMap, {a: 1})); // 2 (gives undefined if key doesn't exists)
关于javascript - 如何在 ES6 Map 中获得深度相等的键?替代使用复杂对象作为 ES6 映射键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57262315/