Elixir累加器地图列表

问题描述 投票:-1回答:1

您能帮我从地图列表中实施一个累加器吗?

[
 %{
    score: 1,
    name: "Javascript",
 },
 %{
    score: 2,
    name: "Elixir",
 },
 %{
    score: 10,
    name: "Elixir",
 }
]

结果应该是:

[
    %{
        score: 12,
        name: "Elixir",
    },
    %{
        score: 1,
        name: "Javascript",
    }
]

感谢您的建议。

问候

erlang elixir
1个回答
0
投票

假设原始列表存储在input局部变量中,则可能以Enum.reduce/3开头。

Enum.reduce/3

无论您是否坚持要拥有一张地图清单(这是IMSO可读性较差的原因,然后Enum.reduce(input, %{}, fn %{score: score, name: name}, acc -> Map.update(acc, name, score, & &1 + score) end) #⇒ %{"Elixir" => 12, "Javascript" => 1} 结果:

Enum.map/2

总结:

Enum.map/2

Sidenote: mapsEnum.map(%{"Elixir" => 12, "Javascript" => 1}, fn {name, score} -> %{name: name, score: score} end) #⇒ [%{name: "Elixir", score: 12}, # %{name: "Javascript", score: 1}] 中(因此在input |> Enum.reduce(%{}, fn %{score: score, name: name}, acc -> Map.update(acc, name, score, & &1 + score) end) |> Enum.map(& %{name: elem(&1, 0), score: elem(&1, 1)}) #⇒ [%{name: "Elixir", score: 12}, # %{name: "Javascript", score: 1}] 中)是未排序。这意味着,如果希望将结果列表按排序,则应显式name它:

score
© www.soinside.com 2019 - 2024. All rights reserved.