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

如何将权限配置对象转换为角色-动作结构的对象数组?

如何将扁平化权限配置转换为按角色分组的对象数组?

原始权限配置对象:

const rolePermission = {
  adminView: true,
  adminCreate: true,
  adminDelete: true,
  userView: true,
  userEdit: true,
  userDelete: false,
};

期望转换为按角色分组的对象数组:

const rolePermission = [
  { role: "admin", action: ["View", "Create", "Delete"] },
  { role: "user", action: ["View", "Edit"] },
];

实现方法

可以通过JavaScript的Object.entries和reduce方法结合正则匹配完成转换,代码如下:

const originalPermissions = {
  adminView: true,
  adminCreate: true,
  adminDelete: true,
  userView: true,
  userEdit: true,
  userDelete: false,
};

const transformedPermissions = Object.entries(originalPermissions).reduce((result, [key, hasPermission]) => {
  // 匹配角色(小写前缀)和操作(首字母大写的后缀)
  const keyParts = key.match(/^([a-z]+)([A-Z][a-z]+)$/);
  // 跳过无权限(值为false)或格式不符合的项
  if (!keyParts || !hasPermission) return result;

  const [_, role, action] = keyParts;
  // 查找结果中是否已有该角色
  const roleItem = result.find(item => item.role === role);

  if (roleItem) {
    // 已有角色则追加操作
    roleItem.action.push(action);
  } else {
    // 无该角色则新增角色条目
    result.push({ role, action: [action] });
  }

  return result;
}, []);

console.log(transformedPermissions);

逻辑说明

  1. Object.entries(originalPermissions)将原始对象转换为[键名, 权限值]的数组,方便遍历处理
  2. reduce方法遍历每一项,用空数组作为初始结果容器
  3. 正则表达式/^([a-z]+)([A-Z][a-z]+)$/拆分键名,提取出角色(如admin)和操作(如View)
  4. 跳过权限值为false的项,只保留有权限的操作
  5. 检查结果数组中是否已存在当前角色,存在则追加操作,不存在则新增角色对象
  6. 最终返回的result就是目标格式的数组

内容的提问来源于stack exchange,提问作者Nandha Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:01:21