如何使用Map API获取对象类型键对应的存储值
问题原因
Map 对键的匹配遵循「SameValueZero」比较规则,对象类型的键会按照内存引用地址匹配,而非内容匹配。你调用 myMap.set({a: 1}, 'hi') 时传入的对象,和调用 myMap.get({a: 1}) 时传入的对象是两个完全独立的内存实例,引用地址不同,因此无法匹配到对应值。
解决方案
方案1:保留原对象引用(官方推荐,性能最优)
如果能控制键的创建逻辑,直接将作为键的对象存入变量,取值时传入同一个变量即可:
// 存储键的引用 const objKey = { a: 1 }; const myMap = new Map(); myMap.set(objKey, 'hi'); // 取值时传入同一个引用 console.log(myMap.get(objKey)); // 输出 'hi'
方案2:遍历匹配对象内容(适合无法保留引用的场景)
如果无法拿到原键的引用,需要按对象内容匹配,可遍历 Map 的所有键值对,手动对比键的内容:
// 简单的内容匹配工具函数,复杂结构可替换为深比较逻辑 function getByObjectContent(map, targetKey) { for (const [key, value] of map.entries()) { if (typeof key === 'object' && key !== null) { // 注:JSON.stringify 仅适用于简单对象,存在属性顺序不一致、值为undefined/函数/Symbol时会匹配错误 if (JSON.stringify(key) === JSON.stringify(targetKey)) { return value; } } } return undefined; } // 调用示例 console.log(getByObjectContent(myMap, {a: 1})); // 输出 'hi'
方案3:提前序列化键(适合高频查询场景)
如果业务场景不需要保留对象引用作为键,可在存储时将对象序列化为字符串作为键,查询时同样序列化后匹配,性能远高于遍历:
const myMap = new Map(); // 存储时序列化对象键 myMap.set(JSON.stringify({a: 1}), 'hi'); // 查询时序列化目标对象 console.log(myMap.get(JSON.stringify({a: 1}))); // 输出 'hi'
内容的提问来源于stack exchange,提问作者embracethefuture
相关产品推荐
相关产品推荐

