0

I have a array similar to this one:

[
   {
      "username":"player1",
      "nickname":"PLayer1",
      "capturedate":"06/12/2022",
      "capturetime":"10:05PM"
   },
   {
      "username":"player1",
      "nickname":"PLayer1",
      "capturedate":"06/12/2022",
      "capturetime":"10:00PM"
   },
   {
      "username":"player1",
      "nickname":"PLayer1",
      "capturedate":"06/12/2022",
      "capturetime":"10:10PM"
   },
   {
      "username":"player1",
      "nickname":"PLayer1",
      "capturedate":"06/12/2022",
      "capturetime":"10:15PM"
   },
   {
      "username":"player2",
      "nickname":"player2",
      "capturedate":"06/12/2022",
      "capturetime":"10:00PM"
   },
   {
      "username":"player2",
      "nickname":"player2",
      "capturedate":"06/12/2022",
      "capturetime":"10:05PM"
   }
]

I want to transform it so that it looks like this. Basically all of the capturedate and capturetime would be merged to a single array of just entries.

[
   {
      "username":"player1",
      "nickname":"Player1",
      "entries":[
         {
            "capturedate":"06/12/2022",
            "capturetime":"10:05PM"
         },
         {
            "capturedate":"06/12/2022",
            "capturetime":"10:10PM"
         },
         {
            "capturedate":"06/12/2022",
            "capturetime":"10:10PM"
         },
         {
            "capturedate":"06/12/2022",
            "capturetime":"10:15PM"
         }
      ]
   },
   {
      "username":"player2",
      "nickname":"Player2",
      "entries":[
         {
            "capturedate":"06/12/2022",
            "capturetime":"10:00PM"
         },
         {
            "capturedate":"06/12/2022",
            "capturetime":"10:05PM"
         }
      ]
   }
]

I tried implementing the one from here Most efficient method to groupby on an array of objects but it's giving a different set.

kams
  • 128
  • 11
  • 1
    Does this answer your question? [Group array items using object](https://stackoverflow.com/questions/31688459/group-array-items-using-object) – pilchard Jun 18 '22 at 16:58
  • 1
    also [Collect array into sub array buckets based on value (which is array in itself )](https://stackoverflow.com/questions/64954243/collect-array-into-sub-array-buckets-based-on-value-which-is-array-in-itself/64954520#64954520) – pilchard Jun 18 '22 at 17:10

2 Answers2

0

What you are probably missing is the Object.values step. since the post you mentioned has answers which does the grouping only giving the final output an object. To get the values of the grouped object you will need to use Object.values

let arr = [   {      "username":"player1",      "nickname":"PLayer1",      "capturedate":"06/12/2022",      "capturetime":"10:05PM"   },   {      "username":"player1",     "nickname":"PLayer1",      "capturedate":"06/12/2022",      "capturetime":"10:00PM"   },   {      "username":"player1",      "nickname":"PLayer1",      "capturedate":"06/12/2022",      "capturetime":"10:10PM"   },   {      "username":"player1",      "nickname":"PLayer1",      "capturedate":"06/12/2022",      "capturetime":"10:15PM"   },   {      "username":"player2",      "nickname":"player2",      "capturedate":"06/12/2022",      "capturetime":"10:00PM"   },   {      "username":"player2",      "nickname":"player2",      "capturedate":"06/12/2022",      "capturetime":"10:05PM"   }]

let res = Object.values(arr.reduce((acc,{username,nickname,...rest})=>{
    acc[username] = acc[username] || {username,nickname,entries:[]}
  acc[username].entries.push(rest)
  return acc
},{}))

console.log(res)
cmgchess
  • 7,996
  • 37
  • 44
  • 62
0

Here you go:


let players = [/* ... your data ... */]

let result = [];
players.forEach((player) => {
  let existingPlayer = result.find((p) => p.username === player.username);
  if (!existingPlayer) {
    existingPlayer = {
      username: player.username,
      nickname: player.nickname,
      entries: []
    };
    result.push(existingPlayer);
  }
  existingPlayer.entries.push({
    capturedate: player.capturedate,
    capturetime: player.capturetime
  });
});

console.log(result);

yiddishe-kop
  • 558
  • 1
  • 7
  • 11