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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:47:18