您能帮我从地图列表中实施一个累加器吗?
[
%{
score: 1,
name: "Javascript",
},
%{
score: 2,
name: "Elixir",
},
%{
score: 10,
name: "Elixir",
}
]
结果应该是:
[
%{
score: 12,
name: "Elixir",
},
%{
score: 1,
name: "Javascript",
}
]
感谢您的建议。
问候
假设原始列表存储在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: maps在Enum.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}]
中)是未排序。这意味着,如果希望将结果列表按erlang或elixir排序,则应显式name
它:
score