JavaScript 的 Set 适合权限角色集合运算管理,因其天然支持去重、增删查及并集、交集、差集等操作,语义清晰且性能优于数组;可封装工具函数实现多 Set 并集、交集与差集,并搭配 Map 构建轻量前端权限系统。

JavaScript 中的 Set 非常适合做权限角色的集合运算管理,因为它天然支持去重、增删查和数学集合操作(如并集、交集、差集),比数组更语义清晰、性能更优。
用 Set 存储角色或权限标识
每个角色可映射为一组权限字符串(如 "read"、"write"、"delete"),用 Set 保存,避免重复,也方便后续计算:
- 定义角色权限:
const admin = new Set(["read", "write", "delete", "manage"]); - 用户可能拥有多个角色,合并时直接用展开语法:
const userPerms = new Set([...admin, ...editor]); - 动态添加/移除权限:
userPerms.add("audit");userPerms.delete("delete");
实现并集(角色叠加)
当用户同时具备多个角色时,需要合并所有权限 —— 这就是并集:
- 简单合并:用扩展运算符生成新 Set
const union = new Set([...roleA, ...roleB]); - 封装成工具函数:
const union = (...sets) => new Set(sets.flatMap(s => [...s])); - 示例:
union(admin, editor); // 包含两者全部权限,自动去重
实现交集(最小公共权限)
交集可用于判断某功能是否被多个角色共同允许(例如“仅管理员和审计员都能访问”):
立即学习“Java免费学习笔记(深入)”;
- 手动遍历较小 Set 判断是否都在另一个中:
const intersection = (a, b) => new Set([...a].filter(x => b.has(x))); - 支持多个 Set 的交集:
const intersectAll = (...sets) => sets.reduce((a, b) => new Set([...a].filter(x => b.has(x)))); - 注意:空 Set 参与时结果为空,符合集合逻辑
实现差集(权限剔除或限制)
差集常用于“赋予基础权限,再排除敏感操作”场景,比如给编辑角色加权限但禁止删除:
- 从 A 中排除 B 的权限:
const difference = (a, b) => new Set([...a].filter(x => !b.has(x))); - 实际应用:
const limitedEditor = difference(editor, new Set(["delete"])); - 也可链式组合:
difference(union(admin, editor), new Set(["manage"]));
不复杂但容易忽略的是:Set 本身不提供原生交集/差集方法,需手动实现;但逻辑简洁、可读性强,且运行时性能优于反复 filter 数组。搭配 Map 管理角色名到 Set 的映射,就能构建轻量灵活的前端权限系统。


















