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

Min*_*ing 7 javascript ecmascript-6

下面是一些示例 Javascript (ES6) 代码,它们不会按照直觉想象的那样做。

const exampleMap = new Map([[{a: 1}, 2]]);
console.log(exampleMap.get({a: 1}));
Run Code Online (Sandbox Code Playgroud)

事实证明,这会打印undefined. 为什么?这个 StackOverflow answer 中涵盖了推理。每对MDN条目地图Map使用===为重点的平等。并且,根据的 MDN 条目===Objects 通过引用相等进行比较。

这一切都很好。它完全按照文档所说的去做。不幸的是,上面的代码试图做的事情会非常有用,即使它不是规范的实际行为。

我如何使用Map,或者我应该使用什么来代替Map,来获得键值查找,其中键是通过对象深度相等语义进行比较的?

Cer*_*nce -1

您需要以某种方式比较或获取对用作 Map 键的确切对象的引用。一种选择是迭代 Map 的entries,并检查其键值a为 1 的映射:

const exampleMap = new Map([[{a: 1}, 2]]);
const foundEntry = [...exampleMap.entries()]
  .find(([key, val]) => key.a === 1);
  
console.log(
  foundEntry
  ? foundEntry[1]
  : 'Not found!'
);
Run Code Online (Sandbox Code Playgroud)

另一种方法:

const exampleMap = new Map([[{a: 1}, 2]]);
const foundKey = [...exampleMap.keys()]
  .find(key => key.a === 1);
  
console.log(
  foundKey
  ? exampleMap.get(foundKey)
  : 'Not found!'
);
Run Code Online (Sandbox Code Playgroud)