如何对比两个模块对象数组并标记用户权限操作状态?
实现方案(JavaScript)
我们可以通过先整理用户权限为高效查询结构,再遍历系统模块逐一对比标记的方式实现需求,以下是具体步骤:
1. 定义输入数据
const systemModules = { "modules": { "member": { "actions": ["create", "edit"] }, "subscription": { "actions": ["create", "edit", "move_out", "renew", "void"] } } }; const userModules = { "user_modules": { "subscription": { "actions": ["create", "edit"] } } };
2. 构建用户权限查询表
将用户可访问的模块与操作转换成嵌套Set结构,实现O(1)时间复杂度的存在性判断:
const userPermissions = {}; for (const moduleName in userModules.user_modules) { userPermissions[moduleName] = new Set(userModules.user_modules[moduleName].actions); }
3. 遍历系统模块生成标记结果
const result = { modules: {} }; for (const moduleName in systemModules.modules) { const module = systemModules.modules[moduleName]; result.modules[moduleName] = { actions: {} }; module.actions.forEach(action => { // 判断用户是否拥有当前模块的该操作权限 const hasAccess = userPermissions[moduleName]?.has(action) || false; result.modules[moduleName].actions[action] = hasAccess ? 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 } } } }
补充说明
- 使用Set存储用户操作,是因为
has()方法比数组includes()的查询效率更高,适合操作数量较多的场景。 - 代码中用可选链
?.避免用户无对应模块时的报错,若需兼容旧环境,可替换为userPermissions[moduleName] && userPermissions[moduleName].has(action)。
内容的提问来源于stack exchange,提问作者Ashley Mok
相关产品推荐
相关产品推荐

