I'm making a game where each player can submit an answer on a given question and other players can vote on an answer of another player. I store these results in an array of game rounds which may look something like the following:
const roundHistory = [
{
question: 'question1',
submissions: [
{
explanation: 'answer1',
player: { id: 'id1', name: 'player1' },
votes: [
{ id: 'id2', name: 'player2' },
{ id: 'id3', name: 'player3' },
],
},
{
explanation: 'answer2',
player: { id: 'id2', name: 'player2' },
votes: [{ id: 'id1', name: 'player1' }],
},
{
explanation: 'answer3',
player: { id: 'id3', name: 'player3' },
votes: [],
},
],
},
{
question: 'question2',
submissions: [
{
explanation: 'answer1',
player: { id: 'id1', name: 'player1' },
votes: [
{ id: 'id2', name: 'player2' },
{ id: 'id3', name: 'player3' },
],
},
{
explanation: 'answer2',
player: { id: 'id2', name: 'player2' },
votes: [{ id: 'id1', name: 'player1' }],
},
{
explanation: 'answer3',
player: { id: 'id3', name: 'player3' },
votes: [],
},
],
},
];
As you can see there are 3 players in the game since each round (index of the roundHistory array) has 3 submissions. Each submission has a property player which represents the player who submitted the submission. And then each submission has a property votes which is an array of the players who voted for that submission. Now my question:
How can I get the total received votes per player of all rounds?
What I've tried so far... I thought, first I'd get the total received votes per player per round like so:
const roundHistory = [{question:'question1',submissions:[{explanation:'answer1',player:{id:'id1',name:'player1'},votes:[{id:'id2',name:'player2'},{id:'id3',name:'player3'},],},{explanation:'answer2',player:{id:'id2',name:'player2'},votes:[{id:'id1',name:'player1'}],},{explanation:'answer3',player:{id:'id3',name:'player3'},votes:[],},],},{question:'question2',submissions:[{explanation:'answer1',player:{id:'id1',name:'player1'},votes:[{id:'id2',name:'player2'},{id:'id3',name:'player3'},],},{explanation:'answer2',player:{id:'id2',name:'player2'},votes:[{id:'id1',name:'player1'}],},{explanation:'answer3',player:{id:'id3',name:'player3'},votes:[],},],},];
const getTotalReceivedVotesPerPlayerInRound = (round) => {
return roundHistory[round].submissions.map((s) => ({
player: s.player,
totalVotes: s.votes.length,
}));
}
console.log(getTotalReceivedVotesPerPlayerInRound(0));
But I got stuck at adding all results of all rounds together. Note that I tried to simplify all used objects such as a player. In my application these are mostly classes for which I have several utility methods. One of them is the getTotalReceivedVotesPerPlayerInRound() method that I can use on a round (index of the roundHistory array).
I expect the final result to be of the same shape as the result of my already written function: An array of objects with two properties: player (the player object) and totalVotes. E. g.:
const result = [
{
"player": {
"id": "id1",
"name": "player1"
},
"totalVotes": 2
},
{
"player": {
"id": "id2",
"name": "player2"
},
"totalVotes": 1
},
{
"player": {
"id": "id3",
"name": "player3"
},
"totalVotes": 0
}
];