Reputation: 13
i have an array that looks like this:
array = [{game: 1, team: aName, score: 10 },{game: 1, team: bName, score: 1}, {game: 2, team: aName, score: 20}, {game:2, team: bName, score: 30}]
i need a way to sum all the scores from the different teams so i get something like this:
sumArray = [{team:aName, score: 30},{team:bName, score:31}]
is there a way to achieve this with JS?
thanks!
Upvotes: 0
Views: 91
Reputation: 1142
That what you want
const array = [
{ game: 1, team: 'aName', score: 10 },
{ game: 1, team: 'bName', score: 1 },
{ game: 2, team: 'aName', score: 20 },
{ game: 2, team: 'bName', score: 30 }
]
console.log([...array.reduce((a, c) => {
if (a.has(c.team)) {
a.get(c.team).score += c.score;
} else {
a.set(c.team, c);
}
return a;
}, new Map()).values()])
Upvotes: 1
Reputation: 6714
Using reduce function to gather the scores
const data = [{
game: 1,
team: "aName",
score: 10
}, {
game: 1,
team: "bName",
score: 1
}, {
game: 2,
team: "aName",
score: 20
}, {
game: 2,
team: "bName",
score: 30
}]
const result = Object.values(data.reduce((result, {team, score}) => {
if (!result[team]) result[team] = {team, score}
else result[team].score+=score;
return result;
}, {}));
console.log(result)
Upvotes: 0
Reputation: 1606
Yes, there is.
array = [{game: 1, team: 'aName', score: 10 },{game: 1, team: 'bName', score: 1}, {game: 2, team: 'aName', score: 20}, {game:2, team: 'bName', score: 30}];
sumArray = array
.map(e => e.team) // Map teams
.filter((v, i, s) => s.indexOf(v) == i) // Getting only unique teams
.map(t => ({ team: t, score: array.filter(e => e.team == t).reduce((p, v) => p + v.score, 0) })); // generate a reduced object for each team
console.log(sumArray);
Upvotes: 0