如何将权限配置对象转换为角色-动作结构的对象数组?
如何将扁平化权限配置转换为按角色分组的对象数组?
原始权限配置对象:
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);
逻辑说明
Object.entries(originalPermissions)将原始对象转换为[键名, 权限值]的数组,方便遍历处理reduce方法遍历每一项,用空数组作为初始结果容器- 正则表达式
/^([a-z]+)([A-Z][a-z]+)$/拆分键名,提取出角色(如admin)和操作(如View) - 跳过权限值为
false的项,只保留有权限的操作 - 检查结果数组中是否已存在当前角色,存在则追加操作,不存在则新增角色对象
- 最终返回的
result就是目标格式的数组
内容的提问来源于stack exchange,提问作者Nandha Kumar
相关产品推荐
相关产品推荐

