You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比两个模块对象数组并标记用户权限操作状态?

实现方案(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:28:29