Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Lodash groupBy id of each item of nested array of object

I have the following input as an example of clubs that includes a property players which is an array of objects.

Input

const clubs = [
  {
    id: 5,
    name: 'Club Name',
    creatorId: 10,
    players: [
      {
        userId: 2, // group by this property
        name: 'Player name 1',
        clubId: 5,
      },
      {
        userId: 7, // group by this property
        name: 'Player name 2',
        clubId: 5,
      },
    ],
  },
  {
    id: 6,
    name: 'Club Name 2',
    creatorId: 2,
    players: [
      {
        userId: 7, // group by this property
        name: 'Player name 3',
        clubId: 6,
      },
      {
        userId: 8, // group by this property
        name: 'Player name 4',
        clubId: 6,
      },
      {
        userId: 22, // group by this property
        name: 'Player name 5',
        clubId: 6,
      },
    ],
  },
];

I want to groupBy each of the player.userIds of each club and should have a value of the club for each player, to have the following output.

Desired Output

{
  '2': [{ id: 5, name: 'Club Name', creatorId: 10, players: [Array] }],
  '7': [
    { id: 5, name: 'Club Name', creatorId: 10, players: [Array] },
    { id: 6, name: 'Club Name 2', creatorId: 2, players: [Array] },
  ],
  '8': [{ id: 6, name: 'Club Name 2', creatorId: 2, players: [Array] }],
  '22': [{ id: 6, name: 'Club Name 2', creatorId: 2, players: [Array] }],
};

I have tried

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

const byPlayer = allClubs.reduce((b, a) => {
  a.players.forEach((player) => {
    const id = player.clubId;
    const clubsByPlayer = b[id] || (b[id] = []);
    clubsByPlayer.push(a);
  });
  return b;
}, {});

But it returned the group by the clubId and a value of each player in the club

{
  '5': [
    { id: 5, name: 'Club Name', creatorId: 10, players: [Array] },
    { id: 5, name: 'Club Name', creatorId: 10, players: [Array] },
  ],
  '6': [
    { id: 6, name: 'Club Name 2', creatorId: 2, players: [Array] },
    { id: 6, name: 'Club Name 2', creatorId: 2, players: [Array] },
    { id: 6, name: 'Club Name 2', creatorId: 2, players: [Array] },
  ],
};

>Solution :

Replace

const id = player.clubId;

with

const id = player.userId;
const
    clubs = [{ id: 5, name: 'Club Name', creatorId: 10, players: [{ userId: 2, name: 'Player name 1', clubId: 5 }, { userId: 7, name: 'Player name 2', clubId: 5 }] }, { id: 6, name: 'Club Name 2', creatorId: 2, players: [{ userId: 7, name: 'Player name 3', clubId: 6 }, { userId: 8, name: 'Player name 4', clubId: 6 }, { userId: 22, name: 'Player name 5', clubId: 6 }] }],
    byPlayer = clubs.reduce((b, a) => {
        a.players.forEach((player) => {
            (b[player.userId] ??= []).push(a);
        });
        return b;
    }, {});

console.log(byPlayer)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading