javascript - 如何在 ES6 Map 中获得深度相等的键?替代使用复杂对象作为 ES6 映射键?

标签 javascript ecmascript-6

这里是一些示例 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/

相关文章:

javascript - jquery轮播不显示在浏览器上,但显示在dreamweaver上

javascript - 当我的 Controller 执行功能时显示加载图像

javascript - 为什么 Babel 7 不编译 node_modules 文件?

javascript - 使用没有导航混合的 router.transitionTo() React Router 1.0

javascript - 如何根据嵌套属性值n javascript对数据进行排序

javascript - 下一个生日是谁?

javascript - React 中对象的状态更新是如何准确工作的

javascript - 谁能发现这个 SVG/Javascript 函数哪里出了问题?

javascript - 什么是暂时死区?

javascript - 'let' 和 'const' ECMAScript 2015 (ES6) 有什么区别?