JavaScript中按role_id分组对象并归集权限的高效实现方法
高效重组对象数组的方法
针对你这个需求,用Array.prototype.reduce()来处理是最高效的方案之一——只需要一次遍历就能完成分组和权限归集,时间复杂度是O(n),非常适合处理这类数组重组问题。
首先先明确下你期望的输出结构(根据你的输入推测,应该是把同role_id的权限合并到一个数组里):
[ { role: "Organize Admin", role_id: "id1", permissions: [ { permission_name: "View All Users", active: "true" }, { permission_name: "Create users", active: "true" }, { permission_name: "Edit users", active: "true" } ] }, { role: "System Admin", role_id: "id2", permissions: [ { permission_name: "Edit users", active: "true" } ] } ]
接下来是具体的实现代码:
var xobj = [ { role:"Organize Admin", role_id:"id1", permission_name:"View All Users",active: "true" }, { role:"Organize Admin", role_id:"id1", permission_name:"Create users", active: "true" }, { role:"Organize Admin", role_id:"id1", permission_name:"Edit users", active: "true" }, { role:"System Admin", role_id:"id2", permission_name:"Edit users", active: "true" }, { role:"System Admin", role_id:"id2", permission_name:"Edit users", active: "true" }, ]; const result = Object.values(xobj.reduce((acc, item) => { // 用role_id作为分组的唯一标识键 const key = item.role_id; if (!acc[key]) { // 首次遇到该role_id时,初始化分组对象 acc[key] = { role: item.role, role_id: item.role_id, permissions: [] }; } // 可选:如果需要去重重复的权限项(比如原数组中System Admin的重复项) const isDuplicate = acc[key].permissions.some(p => p.permission_name === item.permission_name && p.active === item.active ); if (!isDuplicate) { acc[key].permissions.push({ permission_name: item.permission_name, active: item.active }); } // 如果不需要去重,直接去掉上面的判断,执行下面这行即可 // acc[key].permissions.push({ permission_name: item.permission_name, active: item.active }); return acc; }, {})); console.log(result);
代码说明:
- reduce函数:核心是用它遍历原数组,借助一个对象
acc作为累加器,存储每个role_id对应的分组数据,一次遍历完成所有操作。 - 分组初始化:当遇到新的
role_id时,创建包含基础角色信息和空权限数组的对象。 - 权限归集:把当前项的权限信息添加到对应分组的权限数组中,可选的去重逻辑能避免重复的权限项。
- Object.values():最后把累加器对象中的值提取出来,转换成你需要的数组格式。
这个方法的优势在于只遍历原数组一次,没有嵌套循环,在数据量较大时也能保持良好的性能,是处理这类分组合并需求的最优选择之一。
内容的提问来源于stack exchange,提问作者power-cut
相关产品推荐
相关产品推荐

