You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 22:45:03