-2

I'm trying to group by and flatten this array of objects:

const data = [
            { RoleId: 1, RoleName: 'Admin', Permissions: 1 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 38 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 4 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 18 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 4001 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 30 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 20 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 2 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 10 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 99 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 5 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 22 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 4002 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 34 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 32 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 3 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 14 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 6 },
            { RoleId: 1, RoleName: 'Admin', Permissions: 26 },
            { RoleId: 2, RoleName: 'AgencyAdmin', Permissions: 10 },
            { RoleId: 2, RoleName: 'AgencyAdmin', Permissions: 3 },
            { RoleId: 2, RoleName: 'AgencyAdmin', Permissions: 4001 },
            { RoleId: 2, RoleName: 'AgencyAdmin', Permissions: 18 },
            { RoleId: 2, RoleName: 'AgencyAdmin', Permissions: 4002 },
            { RoleId: 2, RoleName: 'AgencyAdmin', Permissions: 30 },
            { RoleId: 2, RoleName: 'AgencyAdmin', Permissions: 2 },
            { RoleId: 3, RoleName: 'InstituteAdmin', Permissions: 30 },
            { RoleId: 3, RoleName: 'InstituteAdmin', Permissions: 6 },
            { RoleId: 3, RoleName: 'InstituteAdmin', Permissions: 10 },
            { RoleId: 3, RoleName: 'InstituteAdmin', Permissions: 2 },
            { RoleId: 3, RoleName: 'InstituteAdmin', Permissions: 4002 },
            { RoleId: 3, RoleName: 'InstituteAdmin', Permissions: 18 },
            { RoleId: 3, RoleName: 'InstituteAdmin', Permissions: 3 },
            { RoleId: 3, RoleName: 'InstituteAdmin', Permissions: 4001 }
        ];

I've tried using lodash's groupBy method but I am unable to group by multiple keys and tried using zipObject as well but I was unable to get the expected results

groupBy(data, 'RoleId')

Gives me an array that's grouped by the RoleId but the same doesn't work using an array of keys

What I want the resulting array to look like is as follows:

[
{RoleId: 1, RoleName:'Admin', Permissions: [1, 38, 4, 18, ...]},
{RoleId: 2, RoleName:'AgencyAdmin', Permissions: [1, 38, 4, 18, ...]},
{RoleId: 3, RoleName:'InstituteAdmin', Permissions: [1, 38, 4, 18, ...]},
]

Does someone know how I can tackle this problem? Any help would be appreciated. Thank you!

2 Answers2

1

Using reduce:

const data = [{"RoleId":1,"RoleName":"Admin","Permissions":1},{"RoleId":1,"RoleName":"Admin","Permissions":38},{"RoleId":1,"RoleName":"Admin","Permissions":4},{"RoleId":1,"RoleName":"Admin","Permissions":18},{"RoleId":1,"RoleName":"Admin","Permissions":4001},{"RoleId":1,"RoleName":"Admin","Permissions":30},{"RoleId":1,"RoleName":"Admin","Permissions":20},{"RoleId":1,"RoleName":"Admin","Permissions":2},{"RoleId":1,"RoleName":"Admin","Permissions":10},{"RoleId":1,"RoleName":"Admin","Permissions":99},{"RoleId":1,"RoleName":"Admin","Permissions":5},{"RoleId":1,"RoleName":"Admin","Permissions":22},{"RoleId":1,"RoleName":"Admin","Permissions":4002},{"RoleId":1,"RoleName":"Admin","Permissions":34},{"RoleId":1,"RoleName":"Admin","Permissions":32},{"RoleId":1,"RoleName":"Admin","Permissions":3},{"RoleId":1,"RoleName":"Admin","Permissions":14},{"RoleId":1,"RoleName":"Admin","Permissions":6},{"RoleId":1,"RoleName":"Admin","Permissions":26},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":10},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":3},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":4001},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":18},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":4002},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":30},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":2},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":30},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":6},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":10},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":2},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":4002},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":18},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":3},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":4001}];

// Iterate over `data` (acc is the accumulated output (an object)
// Note that because the accumulator output is an object
// we need to pick out its values to create the final output
const out = Object.values(data.reduce((acc, current) => {

  // Destructure the properies from the current object
  const { RoleId, Permissions, ...rest } = current;

  // If the object doesn't already contain a RoleId key set up a new object with an
  // empty permissions array
  acc[RoleId] = acc[RoleId] || { RoleId, Permissions: [], ...rest };

  // Push the permissions of the current object to the permissions array
  acc[RoleId].Permissions.push(Permissions);

  // Return the accumulator for the next iteration
  return acc;
}, {}));

console.log(out);
Andy
  • 61,948
  • 13
  • 68
  • 95
0

You can group by the RoleId first and then loop through the individual groups to construct the collection of permissions. Here is an example:

const data = [{"RoleId":1,"RoleName":"Admin","Permissions":1},{"RoleId":1,"RoleName":"Admin","Permissions":38},{"RoleId":1,"RoleName":"Admin","Permissions":4},{"RoleId":1,"RoleName":"Admin","Permissions":18},{"RoleId":1,"RoleName":"Admin","Permissions":4001},{"RoleId":1,"RoleName":"Admin","Permissions":30},{"RoleId":1,"RoleName":"Admin","Permissions":20},{"RoleId":1,"RoleName":"Admin","Permissions":2},{"RoleId":1,"RoleName":"Admin","Permissions":10},{"RoleId":1,"RoleName":"Admin","Permissions":99},{"RoleId":1,"RoleName":"Admin","Permissions":5},{"RoleId":1,"RoleName":"Admin","Permissions":22},{"RoleId":1,"RoleName":"Admin","Permissions":4002},{"RoleId":1,"RoleName":"Admin","Permissions":34},{"RoleId":1,"RoleName":"Admin","Permissions":32},{"RoleId":1,"RoleName":"Admin","Permissions":3},{"RoleId":1,"RoleName":"Admin","Permissions":14},{"RoleId":1,"RoleName":"Admin","Permissions":6},{"RoleId":1,"RoleName":"Admin","Permissions":26},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":10},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":3},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":4001},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":18},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":4002},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":30},{"RoleId":2,"RoleName":"AgencyAdmin","Permissions":2},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":30},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":6},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":10},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":2},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":4002},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":18},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":3},{"RoleId":3,"RoleName":"InstituteAdmin","Permissions":4001}];
var groups = _.groupBy(data, 'RoleId');

var result = _.keys(groups).map(k => {
  return {
    ..._.pick(groups[k][0], ['RoleId', 'RoleName']),
    Permissions: _.map(groups[k], 'Permissions')
  }
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
31piy
  • 23,323
  • 6
  • 47
  • 67