【问题标题】:Group objects with same property - javascript对具有相同属性的对象进行分组 - javascript
【发布时间】:2018-10-24 17:18:24
【问题描述】:

我有一个简单的对象

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" },
];

我正在努力根据 role_id 重组对象,同时为每个 role_id 分组权限

i want something like this

实现这一目标的有效方法是什么?

【问题讨论】:

    标签: javascript jquery arrays javascript-objects


    【解决方案1】:

    使用.reduce对角色对象进行分组,并在里面使用.find在累加器数组中找到匹配的id对象(如果存在的话):

    const input = [
      { 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 roles = input.reduce((a, { role_id, permission_name: name, active }) => {
      const foundRole = a.find(({ id }) => id === role_id);
      if (foundRole) foundRole.permissions.push({ name, active });
      else a.push({ id: role_id, permissions: [{ name, active }] });
      return a;
    }, []);
    console.log(roles);

    【讨论】:

      【解决方案2】:

      另一种方法是使用对象并将内容累积到其属性中

      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" },
      ];
      var groups = {};
      xobj.forEach(obj => {	
          if(!groups.hasOwnProperty(obj.role_id)){
              groups[obj.role_id] = [];
          }
          groups[obj.role_id].push(obj);
      })
      console.log(groups)

      【讨论】:

        【解决方案3】:

        这是另一个解决方案:

        搜索用于分组的唯一键。如果它不存在,则添加它并使用当前值为其分配一个数组。否则将当前项附加到现有键。

        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 groupedData = xobj.reduce((acc, x) => {
          const index = acc.findIndex(y => Object.keys(y)[0] === x.role_id)
          if (index < 0) {
            acc.push({
              [x.role_id]: [x]
            });
            return acc;
          }
          acc[index] = {
            ...acc[index],
            [x.role_id]: [...acc[index][x.role_id], x]
          }
          return acc;
        }, [])
        
        console.log(groupedData);

        另外,当有一个列表/数组时,命名你的变量以表明它确实是一个列表/数组,而不是 xobj 在你的情况下。

        【讨论】:

          猜你喜欢
          • 2012-06-27
          • 1970-01-01
          • 2021-02-05
          • 2013-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多