如何将带角色前缀的权限对象合并为后端所需的角色权限结构?
权限格式转换解决方案
需求说明
需要将前端传入的如下格式对象:
{ 'User.permissions.user.view.dashboard': true, 'Admin.permissions.user.view.dashboard': true, 'Admin.permissions.admin.view.dashboard': true, }
转换为后端所需的、以角色名为键、对应权限字符串数组为值的格式:
{ 'User': [ 'permissions.user.view.dashboard' ], 'Admin': [ 'permissions.user.view.dashboard', 'permissions.admin.view.dashboard' ] }
当前问题
你当前使用map方法得到了分散的对象数组,但无法合并为目标格式:
const data = JSON.parse(req.body) const permissions = Object.keys(data).map((key) => { const permParts = key.split('.') return {[permParts[0]]: permParts.slice(1).join('.')} }) console.log(permissions);
输出:
[ { User: 'permissions.user.view.dashboard' }, { Admin: 'permissions.admin.view.dashboard' }, { Admin: 'permissions.user.view.dashboard' } ]
解决代码
改用reduce方法直接累积生成目标对象,替代map:
const data = JSON.parse(req.body); const permissions = Object.keys(data).reduce((acc, key) => { const [role, ...permParts] = key.split('.'); const permission = permParts.join('.'); // 如果角色不存在,初始化空数组 if (!acc[role]) { acc[role] = []; } // 将权限添加到对应角色的数组中 acc[role].push(permission); return acc; }, {}); // 初始值为空对象 console.log(permissions);
代码说明
- 使用
reduce遍历所有键,acc作为累积的目标对象,初始值为空对象{} - 通过解构拆分键的第一部分为角色名称,剩余部分拼接为完整权限字符串
- 检查累积对象中是否已有该角色的数组,没有则创建空数组
- 将权限字符串推入对应角色的数组,最终返回累积对象,得到目标格式
内容的提问来源于stack exchange,提问作者Ernestas
相关产品推荐
相关产品推荐

