-1

I have data in this structure coming from my Node into my React.

[
{Field: Data, WinningPlayer: "Name1", Points: 3}
{Field: Data, WinningPlayer: "Name2", Points: 8}
{Field: Data, WinningPlayer: "Name1", Points: 4}
{Field: Data, WinningPlayer: "Name2", Points: 2}
]

How do I group on WinningPlayer and then sum the values for that player. I have gone through a few of the posts, but I am unable to understand how to use reduce or any other array function. Can someone please help?

Sandy
  • 127
  • 1
  • 12
  • https://stackoverflow.com/questions/19233283/sum-javascript-object-propertya-values-with-same-object-propertyb-in-array-of-ob This didn't help? – hp77 Jul 11 '21 at 20:05
  • Does this answer your question? [group by, and sum, and generate a object for each array javascript](https://stackoverflow.com/questions/50338082/group-by-and-sum-and-generate-a-object-for-each-array-javascript), or [How to group by and sum an array of objects?](https://stackoverflow.com/questions/29364262/how-to-group-by-and-sum-an-array-of-objects), or [Sum javascript object propertyA values with same object propertyB in array of objects](https://stackoverflow.com/questions/19233283/sum-javascript-object-propertya-values-with-same-object-propertyb-in-array-of-ob) – pilchard Jul 11 '21 at 20:38

3 Answers3

0

If I understood your question correctly this should do the trick:

playerPoints = [
{Field:'', WinningPlayer: "Name1", Points: 3},
{Field: '', WinningPlayer: "Name2", Points: 8},
{Field: '', WinningPlayer: "Name1", Points: 4},
{Field: '', WinningPlayer: "Name2", Points: 2},
];

summedUpPoints = {}

playerPoints.forEach(data => {
    if( typeof summedUpPoints[data.WinningPlayer] === 'undefined'){
    summedUpPoints[data.WinningPlayer] = data.Points;
  }else{
    summedUpPoints[data.WinningPlayer] += data.Points;
  }
});

console.log(summedUpPoints);
Marko Borković
  • 1,884
  • 1
  • 7
  • 22
0

I would personally use the Array.prototype.reduce function for this:

const data = [{WinningPlayer: "Name1", Points: 3},{WinningPlayer: "Name2", Points: 8},{WinningPlayer: "Name1", Points: 4},{WinningPlayer: "Name2", Points: 2}];

const out = data.reduce((acc, entry) => {
  if (acc[entry.WinningPlayer]) acc[entry.WinningPlayer] += entry.Points;
  else acc[entry.WinningPlayer] = entry.Points;
  return acc;
}, {} /* <-- starting object */ );

console.log(out);
LaytonGB
  • 1,384
  • 1
  • 6
  • 20
0

You could use Array.prototype.reduce() like this:

const input = [
  { Field: "Data", WinningPlayer: "Name1", Points: 3 },
  { Field: "Data", WinningPlayer: "Name2", Points: 8 },
  { Field: "Data", WinningPlayer: "Name1", Points: 4 },
  { Field: "Data", WinningPlayer: "Name2", Points: 2 },
];

const result = input.reduce((acc, cur) => {
  const found = acc.find((x) => x.WinningPlayer === cur.WinningPlayer);
  found ? (found.Points += cur.Points) : acc.push(cur);
  return acc;
}, []);

console.log(result);
Guerric P
  • 30,447
  • 6
  • 48
  • 86