Map 处理多级关联缓存的核心是分层建模与键类型灵活:用嵌套 Map 实现「用户→设备→会话」三级索引,支持快速查删;以对象/函数为键实现动态上下文缓存(WeakMap 防泄漏);结合 Set 管理多对多关系;通过 getOrInsertComputed 自动缓存高成本计算。

用 Map 处理复杂的多级关联缓存数据,核心在于利用其“任意类型作键”和“插入顺序保持”的特性,分层建模关系,避免嵌套对象的 key 限制与遍历开销。关键不是堆深度,而是让每一层的映射逻辑清晰、可查、可清理。
用嵌套 Map 构建层级索引
比如管理「用户 → 设备 → 会话」三级关系,不用写 cache[user.id][device.id][session.id] 这种易出错的嵌套对象,而是用三层 Map:
- 外层 Map:用户 ID(字符串)→ 中层 Map
- 中层 Map:设备 ID(字符串)→ 内层 Map
- 内层 Map:会话 ID(字符串)→ 会话数据(对象或时间戳等)
这样每层都支持 has() 快速判断是否存在,get() 拿到下一级容器,且删除某用户时只需 outerMap.delete(userId),自动释放整棵子树内存(无引用时)。
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
用对象/函数作键实现动态上下文缓存
当缓存依赖运行时对象(如组件实例、配置对象、请求参数对象)时,普通 Object 无法以对象为 key,而 Map 可以:
- 把整个请求参数对象作为 key:
cacheMap.set(requestConfig, result) - 把 React 组件实例作为 key,缓存其计算属性:
weakCache.set(component, computedValue)(此时建议用 WeakMap 防止内存泄漏) - 注意:对象键依赖引用相等,不是深比较;若需结构一致缓存,应先序列化成唯一字符串再作 key
结合 Set 管理反向关联与去重集合
多对多关系(如「标签 ↔ 文章」)适合 Map + Set 组合:
-
tagToArticles = new Map<string set>>()</string>:每个标签对应一个文章 ID 的 Set -
articleToTags = new Map<string set>>()</string>:每篇文章对应一个标签名的 Set - 添加关系时,双向更新:
tagToArticles.get('js')?.add('post-123'),articleToTags.get('post-123')?.add('js') - 查某标签下所有文章,直接取 Set 并转数组;删某个文章,遍历它关联的所有标签,从对应 Set 中
delete即可
用 getOrInsertComputed 自动缓存高成本计算
如果某层数据需要实时聚合或复杂推导(如用户总在线时长、设备最近 5 条告警),可借助 core-js 提供的扩展方法:
-
map.getOrInsertComputed(key, () => expensiveCalc())—— 首次调用执行并缓存,后续直接返回 - 适用于服务端渲染预热、首屏关键路径计算等场景
- 注意:该方法非原生,需确保项目已引入
core-js/modules/es.map.get-or-insert-computed

















