javascript 中的 set 基于哈希表实现,has() 平均时间复杂度 o(1),适合高效白名单校验、数组过滤及动态权限管理,但需注意判等规则与数据类型一致性。

JavaScript 中的 Set 是一种非常实用的内置数据结构,天然支持去重和快速查找,特别适合做数据过滤和白名单校验。它内部基于哈希表实现,has() 方法平均时间复杂度为 O(1),比数组 includes() 的 O(n) 高效得多。
用 Set 实现高效白名单校验
白名单校验的核心是判断某个值是否在允许列表中。把白名单预存为 Set,后续每次校验都只需调用 has()。
- 先将合法值(如用户角色、API 接口名、字段名)初始化为
Set - 校验时直接用
whitelist.has(input),返回布尔值 - 相比数组
['admin', 'editor'].includes(role),Set在数据量大或高频校验时性能优势明显
示例:
const whitelist = new Set(['user', 'admin', 'guest']);console.log(whitelist.has('admin')); // true
console.log(whitelist.has('hacker')); // false
结合 filter() 对数组做白名单过滤
若需从原始数组中只保留符合白名单的项,可搭配 Array.prototype.filter() 使用。
- 避免嵌套循环,利用
Set.has()快速判定每个元素是否合规 - 注意:白名单
Set应提前构建,不要在filter回调里重复创建 - 对大小写敏感等细节,可在构建
Set前统一处理(如全转小写)
示例:
const roles = ['ADMIN', 'user', 'root', 'Guest'];const allowed = new Set(['user', 'admin', 'guest']);
const filtered = roles.filter(r => allowed.has(r.toLowerCase()));
// → ['user', 'Guest']
动态维护白名单与实时过滤
白名单可能随配置或权限变化而更新,Set 提供了灵活的增删方法,便于动态管理。
-
add(value)添加新许可项 -
delete(value)移除某项 -
clear()清空全部,配合新数据重建 - 过滤逻辑无需改动,仍用
has(),天然适配变更
示例(权限热更新):
const permissions = new Set(['read', 'write']);permissions.add('delete'); // 动态授权
permissions.delete('write'); // 撤回权限
function checkAccess(action) { return permissions.has(action); }
注意事项与边界情况
Set 虽好,但要注意其行为特性,避免误判:
-
Set判等使用 SameValueZero 算法,0和-0视为相同,NaN与自身相等 - 对象或函数作为键时,比较的是引用而非内容,同一对象多次
add不会重复 - 字符串校验注意空格和大小写,建议提前
trim()和标准化 - 若白名单来自后端 JSON,记得确保字段类型一致(如数字 ID 别混成字符串)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











