Tengo la siguiente entrada como ejemplo de clubs
que incluye una propiedad de players
que es una matriz de objetos.
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, }, ], }, ];
Quiero groupBy
por cada uno de los player.userId
s de cada club y debería tener un valor del club para cada jugador, para tener el siguiente resultado.
{ '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] }], };
Yo he tratado
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; }, {});
Pero devolvió el grupo por el clubId
y un valor de cada jugador en el 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] }, ], };
Reemplazar
const id = player.clubId;
con
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; }