JavaScript中Map可通过路径字符串作key实现树形菜单缓存:扁平化存储全路径节点,O(1)查询;按前缀筛选子树并重建父子关系;增删时同步更新祖先/后代路径;可配合WeakMap实现实例级自动回收。

JavaScript 中的 Map 本身不直接支持树形结构,但可以利用它的键值对特性和引用能力,高效实现多级菜单的树形缓存——核心思路是用路径字符串(如 "system/user/list")作 key,菜单节点对象作 value,并通过路径关系还原父子层级。
用路径字符串做 Map 的 key 实现扁平化缓存
将菜单数据预先“拍平”,每项都带完整路径,存入 Map。这样避免重复遍历嵌套结构,查询 O(1)。
- 菜单项需含
path(唯一路由路径)、id、parentId、name、children(可空)等字段 - 服务端或初始化时,递归生成每个节点的全路径(如父路径 + "/" + 当前 path),作为 Map 的 key
- 示例:
menuCache.set("system", { id: "sys", name: "系统管理", path: "system" });menuCache.set("system/user", { id: "usr", name: "用户管理", path: "user", parentId: "sys" });
按路径前缀快速提取子树
要获取某一级(如 "system")下的所有子菜单,可用 Map 的迭代器筛选 key 是否以该路径开头,并排除自身(可选)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Array.from(menuCache.keys()).filter(k => k.startsWith(prefix) && k !== prefix) - 再根据筛选出的 key 拿到对应节点,按
parentId和path关系重建父子引用(可用 Map 存 id → node 映射辅助) - 无需每次深克隆整个树,只取需展示的部分,内存友好
动态增删时保持 Map 缓存一致性
新增菜单项时,除插入新节点,还要生成并缓存其所有祖先路径(如果尚未存在);删除时,需清除该路径及其所有后代路径。
立即学习“Java免费学习笔记(深入)”;
- 新增:解析新节点
path(如"system/user/role"),拆出["system", "system/user", "system/user/role"],逐个 set 进 Map - 删除:先查出所有以该路径开头的 keys(
Array.from(menuCache.keys()).filter(k => k.startsWith(targetPath))),再批量 delete - 建议封装
addMenu(path, node)和removeMenu(path)方法统一维护
配合 WeakMap 做实例级缓存(进阶)
若菜单树与某个组件实例强绑定(如 Vue 组件、React Hook 内部),可用 WeakMap 关联组件实例和它的菜单 Map,避免内存泄漏。
const instanceMenuCache = new WeakMap();instanceMenuCache.set(componentInstance, new Map());- 组件卸载时,WeakMap 自动回收,无需手动清理

















