
本文介绍如何基于两个嵌套对象数组(系统全量模块与用户可访问模块),动态生成带布尔标记(1/0)的动作权限映射,确保缺失权限自动标记为0,且兼容不完整用户模块结构。
本文介绍如何基于两个嵌套对象数组(系统全量模块与用户可访问模块),动态生成带布尔标记(1/0)的动作权限映射,确保缺失权限自动标记为0,且兼容不完整用户模块结构。
在权限管理系统中,常需将完整的系统功能模块(modules)与当前用户的可操作模块(user_modules)进行细粒度比对,并以键值对形式标注每个动作是否被授权("create": 1 表示允许,"void": 0 表示禁止)。关键挑战在于:user_modules 通常只包含部分模块,且其 actions 是字符串数组而非对象——我们需要将其“升维”为模块级、动作级的布尔映射,同时保持原始 modules 的完整结构。
以下是一个健壮、可读性强的实现方案,使用现代 JavaScript(ES2019+)原生方法完成转换:
const modules = {
"member": {
"actions": ["create", "edit"]
},
"subscription": {
"actions": ["create", "edit", "move_out", "renew", "void"]
}
};
const user_modules = {
"subscription": {
"actions": ["create", "edit"]
}
};
// 主转换逻辑:遍历 modules 每个模块,为其 actions 构建 { action: 1|0 } 对象
const result = {
modules: Object.fromEntries(
Object.entries(modules).map(([moduleName, moduleDef]) => [
moduleName,
{
...moduleDef,
actions: Object.fromEntries(
moduleDef.actions.map(action => [
action,
// 安全检查:若 user_modules 中无此模块,或该模块无 actions 数组,或不包含当前 action → 标记为 0
(user_modules[moduleName]?.actions || []).includes(action) ? 1 : 0
])
)
}
])
)
};
console.log(JSON.stringify(result, null, 2));输出结果:
{
"modules": {
"member": {
"actions": {
"create": 0,
"edit": 0
}
},
"subscription": {
"actions": {
"create": 1,
"edit": 1,
"move_out": 0,
"renew": 0,
"void": 0
}
}
}
}✅ 核心要点说明:
- 使用
Object.entries()+Object.fromEntries()实现对象遍历与重建,语义清晰、无副作用; -
user_modules[moduleName]?.actions || []提供安全访问,避免因模块缺失导致TypeError; - 每个动作的判断逻辑简洁明确:存在即
1,否则0,天然支持稀疏用户权限结构; - 最终
actions由数组转为对象(key-value 形式),符合目标格式要求,也更利于后续前端渲染或权限校验。
⚠️ 注意事项:
- 若后端需保留
actions为数组格式(如[{"action": "create", "allowed": 1}]),可轻松调整映射逻辑为数组 map; - 如需支持多级嵌套(如模块 → 子功能 → 动作),建议封装为递归函数;
- 生产环境建议增加类型校验(如使用 TypeScript 或运行时 schema 验证),防止
actions字段非数组引发异常。
该方案兼顾可维护性与健壮性,无需依赖外部库,可直接集成至 Vue/React 权限初始化逻辑或 Node.js 后端响应构造流程中。

















