如何访问JS Map中以对象为键对应的存储值
问题原因
Map 对键的匹配采用 SameValueZero 相等比较规则,对象属于引用类型数据,你代码中 set 操作传入的 {a: 1} 和 get 操作传入的 {a: 1} 是两个独立的对象,指向不同的内存地址,会被判定为不相等,因此无法匹配到对应值,返回 undefined。
解决方案
- 方法1:复用同一对象引用作为键
提前将作为键的对象赋值给变量,set和get操作都使用该变量即可匹配成功:
let map1 = new Map(); const objKey = {a: 1}; map1.set(objKey, "valueforobject"); console.log(map1.get(objKey)); // 输出:valueforobject
- 方法2:序列化对象为字符串作为键
如果业务场景需要通过对象内容匹配,可以将对象序列化为字符串作为键,字符串属于基础类型,内容一致即可匹配成功:
注意:该方法仅适用于可被JSON序列化的对象,若对象包含函数、Symbol、循环引用等无法序列化的内容会出现匹配异常,同时需注意对象属性顺序会影响序列化结果。
let map1 = new Map(); map1.set(JSON.stringify({a: 1}), "valueforobject"); console.log(map1.get(JSON.stringify({a: 1}))); // 输出:valueforobject
- 方法3:遍历Map自定义匹配规则
如果没有提前保留对象引用、且对象无法直接序列化,可以遍历Map的键值对,自定义匹配规则查找对应值:
let map1 = new Map(); map1.set({a: 1}, "valueforobject"); let targetValue; for (const [key, value] of map1.entries()) { // 自定义匹配逻辑,此处示例匹配a属性等于1的对象 if (key.a === 1) { targetValue = value; break; } } console.log(targetValue); // 输出:valueforobject
内容的提问来源于stack exchange,提问作者NUMBART
相关产品推荐
相关产品推荐

