2017-09-22 2 views
0

J'ai un tableau de ~ 1800 objet représente les jeux joués dans une ligue. J'ai besoin d'un nouveau tableau qui a un objet pour chaque équipe, et inclura 4 nouveaux champs (wins, losses, ties et points). Voici un échantillon du tableau, je travaille avec:carte et réduire un tableau en même temps en javascript

[ 
    { 
    "homeGoals": 2, 
    "gameId": "12221", 
    "homeTeam": { 
     "id": "aasfdsf1", 
     "teamName": "Team 1" 
    }, 
    "awayTeam": { 
     "id": "aasfdsf2", 
     "teamName": "Team 2" 
    }, 
    "id": "ggaew1", 
    "awayGoals": 4 
    }, 
    { 
    "homeGoals": 5, 
    "gameId": "12222", 
    "homeTeam": { 
     "id": "aasfdsf1", 
     "teamName": "Team 1" 
    }, 
    "awayTeam": { 
     "id": "aasfdsf3", 
     "teamName": "Team 3" 
    }, 
    "id": "ggaew2", 
    "awayGoals": 1 
    }, 
    { 
    "homeGoals": 4, 
    "gameId": "12223", 
    "homeTeam": { 
     "id": "aasfdsf2", 
     "teamName": "Team 2" 
    }, 
    "awayTeam": { 
     "id": "aasfdsf3", 
     "teamName": "Team 3" 
    }, 
    "id": "ggaew3", 
    "awayGoals": 4 
    }, 
    { 
    "homeGoals": null, 
    "gameId": "12223", 
    "homeTeam": { 
     "id": "aasfdsf2", 
     "teamName": "Team 2" 
    }, 
    "awayTeam": { 
     "id": "aasfdsf3", 
     "teamName": "Team 3" 
    }, 
    "id": "ggaew4", 
    "awayGoals": null 
    } 
] 

Et voici un exemple de ce que je dois le résultat pour ressembler à:

[ 
    { 
    "id": "aasfdsf1", 
    "name": "Team 1", 
    "wins": 1, 
    "losses": 1, 
    "ties": 0, 
    "points": 2 
    }, 
    { 
    "id": "aasfdsf2", 
    "name": "Team 2", 
    "wins": 1, 
    "losses": 0, 
    "ties": 1, 
    "points": 3 
    }, 
    { 
    "id": "aasfdsf3", 
    "name": "Team 3", 
    "wins": 0, 
    "losses": 1, 
    "ties": 1, 
    "points": 1 
    } 
] 

Certains jeux n'ont pas été joué, de sorte que le homeGoals et awayGoals les champs seront null.

Jusqu'à présent, j'avoir une liste des équipes uniques, que lorsque les jeux ont été réalisés:

const completedGames = games.filter(x => x.homeGoals !== null) 
const homeTeams = [...new Set(completedGames.map(x => x['homeTeam']))]; 
const awayTeams = [...new Set(completedGames.map(x => x['awayTeam']))]; 
const teams = [...new Set([...homeTeams, ...awayTeams])] 

Je sais que je dois faire une sorte de réduire la fonction, mais ai du mal à comprendre cela. Je suis sûr que l'étape que je viens de faire serait sans importance si j'avais une fonction de réduction de carte appropriée. Toute aide serait grandement appréciée!

Répondre

1

Je pense que vous cherchez à quelque chose comme ceci:

const hashMapTeams = games.filter(x => x.homeGoals !== null) 
.reduce((res, match)=>{ 
    /* do the calculations here */ 
    /* put the values on the res object, using res as a HashMap*/ 
    res["/*the home team id*/"].id = /*id value*/ 
    res["/*the home team id*/"].name = /*name value*/ 
    res["/*the home team id*/"].wins= /* the right value */; 
    res["/*the home team id*/"].losses= /* the right value */; 
    res["/*the home team id*/"].ties= /* the right value */; 
    res["/*the home team id*/"].points= /* the right value */; 

    res["/*the away team id*/"].id = /*id value*/ 
    res["/*the away team id*/"].name = /*name value*/ 
    res["/*the away team id*/"].wins= /* the right value */; 
    res["/*the away team id*/"].losses= /* the right value */; 
    res["/*the away team id*/"].ties= /* the right value */; 
    res["/*the away team id*/"].points= /* the right value */; 
},{}); 

/* This will convert again the object to an array */ 
const arrayTeams = Object.keys(hashMapTeams).map(function (key) { return hashMapTeams[key]; }); 
0

Cela obtient le résultat exactement que vous cherchez:

{ 
    "id": "aasfdsf1", 
    "name": "Team 1", 
    "wins": 1, 
    "losses": 1, 
    "ties": 0, 
    "points": 2 
}, 

je tenary et des crochets pour vous montrer plus d'une façon Pour aborder cela, vous pouvez utiliser l'un ou l'autre.

let result = []; 

your1800ArrayObj.map(data => {  
    let wins = data.wins ? data.wins : 0; 
    let losses = data.losses ? data.losses : 0; 
    let ties = data['ties'] || 0; 
    let points = data['points'] || 0; 

    if (data.homeGoals === null && data.awayGoals === null) { 
     console.log('game not played') 
     } else { 
      if (data.homeGoals > data.awayGoals) { 
       wins += 1 
       points += 1 
      } else if (data.homeGoals < data.awayGoals) { 
       losses += 1 
      } else { 
       ties += 1 
      } 
     } 

    result.push({ 
     id: data.id, 
     name: data.homeTeam.teamName , 
     wins: wins, 
     losses: losses, 
     ties: ties, 
     points: points 
    }) 
}) 

return result 
}