Tengo algunos datos en un formato no deseado y me gustaría aplanarlos.
Datos:
[ { team: "Team 1", name: "John" }, { team: "Team 1", name: "Stacy" }, { team: "Team 1", name: "Jason" }, { team: "Team 2", name: "Tim" }, { team: "Team 2", name: "Andrew" }, { team: "Team 2", name: "Steve" } , { team: "Team 3", name: "Eric" }, { team: "Team 3", name: "Frank" }, { team: "Team 3", name: "Cory" } ]El resultado deseado es:
[ { team: "Team 1", name: ["John", "Stacy", "Jason"], count: 3 }, { team: "Team 2", name: ["Tim", "Andrew", "Steve"], count: 3 }, { team: "Team 3", name: ["Eric", "Frank", "Cory"], count: 3 } ] Intenté recorrerlo y usar Object.assing pero ese parecía ser el enfoque incorrecto. ¿Alguna sugerencia sobre un buen enfoque para aplanar estos datos? Gracias
Puedes usar Array.reduce .
En la función de reducción, verifique si el acumulador contiene un elemento con la misma propiedad de team . Si es así, incremente su propiedad de count y empuje la propiedad de name del elemento actual a su propiedad de name .
const arr=[{team:"Team 1",name:"John"},{team:"Team 1",name:"Stacy"},{team:"Team 1",name:"Jason"},{team:"Team 2",name:"Tim"},{team:"Team 2",name:"Andrew"},{team:"Team 2",name:"Steve"},{team:"Team 3",name:"Eric"},{team:"Team 3",name:"Frank"},{team:"Team 3",name:"Cory"}]; const res = arr.reduce((a,b) => { let itm = a.find(e => e.team == b.team); if(itm){ itm.count++; itm.name.push(b.name); }else{ a.push({team: b.team, name: [b.name], count:1}) } return a; }, []) console.log(res)Una solución más eficiente:
const arr=[{team:"Team 1",name:"John"},{team:"Team 1",name:"Stacy"},{team:"Team 1",name:"Jason"},{team:"Team 2",name:"Tim"},{team:"Team 2",name:"Andrew"},{team:"Team 2",name:"Steve"},{team:"Team 3",name:"Eric"},{team:"Team 3",name:"Frank"},{team:"Team 3",name:"Cory"}]; const obj = arr.reduce((a,b) => { let itm = a[b.team] if(itm){ itm.count++; itm.name.push(b.name); }else{ a[b.team] = {team: b.team, name: [b.name], count: 0} } return a; }, {}) const res = Object.keys(obj).map(e => obj[e]) console.log(res)