javascript - Hur man omkarta en array av objekt till en ny array
Jag har denna initiala array:
const initialData = [
{
day: 1,
values: [
{
name: 'Roger',
score: 90,
},
{
name: 'Kevin',
score: 88,
},
{
name: 'Steve',
score: 80,
},
],
},
{
day: 2,
values: [
{
name: 'Roger',
score: 70,
},
{
name: 'Michael',
score: 88,
},
],
},
{
day: 3,
values: [
{
name: 'Steve',
score: 97,
},
],
},
];
att omvandlas till:
const result = [
{
name: 'Roger',
scores: [90, 70, null],
},
{
name: 'Kevin',
scores: [88, null, null],
},
{
name: 'Steve',
scores: [80, null, 97],
},
{
name: 'Michael',
scores: [null, 88, null],
},
];
Jag försöker använda array map och skapa en temporär array:
const holder = [];
initialData.map()
men utan resultat
Svar #1
Du kan göra detta i ett par steg - först reduce så att du kan indexera efter namn, och sedan map de posterna till det format du förväntade dig
const initialData = [{day:1,values:[{name:"Roger",score:90},{name:"Kevin",score:88},{name:"Steve",score:80}]},{day:2,values:[{name:"Roger",score:70},{name:"Michael",score:88}]},{day:3,values:[{name:"Steve",score:97}]}];
var result = Object.entries(initialData.reduce( (acc,item) => {
item.values.forEach( v => {
if(!acc[v.name]) acc[v.name] = {};
acc[v.name][item.day] = v.score;
});
return acc;
},{})).map( ([name,days]) => ({
name,
scores: new Array(initialData.length).fill(null).map( (_,i) => days[i+1] || null)
}))
console.log(result);Svar #2
Du kan använda reduce och forEach för att skapa ett objekt för varje namn och sedan för att få en array från det objektet kan du bara använda Object.values-metoden.
const data = [{"day":1,"values":[{"name":"Roger","score":90},{"name":"Kevin","score":88},{"name":"Steve","score":80}]},{"day":2,"values":[{"name":"Roger","score":70},{"name":"Michael","score":88}]},{"day":3,"values":[{"name":"Steve","score":97}]}]
const obj = data.reduce((r, { values }, i) => {
values.forEach(({ name, score }) => {
if (!r[name]) r[name] = { name, scores: Array(data.length).fill(null)}
r[name].scores[i] = score
})
return r;
}, {})
const result = Object.values(obj)
console.log(result)