2017-10-15 8 views
0
games = 
    [ { id = 1 
     , points = 
      [ { player_id = 1, score = 20 } 
      , { player_id = 2, score = 10 } 
      , { player_id = 3, score = 0 } 
      ] 
     } 
    , { id = 2 
     , points = 
      [ { player_id = 1, score = 20 } 
      , { player_id = 2, score = 5 } 
      , { player_id = 3, score = 0 } 
      ] 
     } 
    , { id = 3 
     , points = 
      [ { player_id = 1, score = 20 } 
      , { player_id = 2, score = 5 } 
      , { player_id = 3, score = 10 } 
      ] 
     } 
    ] 

J'ai une liste d'enregistrements 'jeux' qui ont chacun une liste de points pour chaque joueur. Est-il possible de fold chaque score de chaque joueur à travers chaque jeu pour afficher un «total».Elm: Plier des valeurs spécifiques de plusieurs listes

Quelque chose comme:

[ { player_id = 1, score = 60 } 
, { player_id = 2, score = 20 } 
, { player_id = 3, score = 10 } 
] 

Merci à l'avance.

Répondre

2

Vous avez besoin d'un double pli, où le code clé est

main : Html msg 
main = 
    let 
     go { points } acc = 
      let 
       goInner { player_id, score } accInner = 
        Dict.update player_id (updater score) accInner 
      in 
      List.foldl goInner acc points 
    in 
    List.foldl go Dict.empty games 
     |> toString 
     |> text 

updater : Int -> Maybe Int -> Maybe Int 
updater score existingVal = 
    existingVal 
     |> Maybe.withDefault 0 
     |> (+) score 
     |> Just 

Voir [https://ellie-app.com/gq8VFfS8Ja1/0](this ellie) Cela vous obtient la réponse que vous voulez mais dans un format légèrement différent

+0

brillant. Je vous remercie. J'ai quelques lectures à faire. –