如果我有以下表格的集合:
[{key, value}, {key, value2}, {key2, value3}]
如何将其转换为表单的地图
%{key => [value, value2], key2 => [value3]}
?
答案 0 :(得分:2)
使用Map.update/4
进行缩小会很合适:
[{:key, :value}, {:key, :value2}, {:key2, :value3}]
|> Enum.reduce(%{}, fn {k, v}, acc ->
Map.update(acc, k, [v], fn l -> [v | l] end)
end)
#⇒ %{key: [:value2, :value], key2: [:value3]}
要保留列表顺序,请随后映射到{k, Enum.reverse(n)}
。
[{:key, :value}, {:key, :value2}, {:key2, :value3}]
|> Enum.reduce(%{}, fn {k, v}, acc ->
Map.update(acc, k, [v], fn l -> [v | l] end)
end)
|> Enum.map(fn {k, v} -> {k, Enum.reverse(v)} end)
#⇒ %{key: [:value, :value2], key2: [:value3]}
另一个选项是Enum.group_by/3
[{:key, :value}, {:key, :value2}, {:key2, :value3}]
|> Enum.group_by(&elem(&1, 0))
|> Enum.map(fn {k, v} -> {k, Keyword.values(v)} end)
|> Enum.into(%{})
#⇒ %{key: [:value, :value2], key2: [:value3]}
或者,使用映射器:
[{:key, :value}, {:key, :value2}, {:key2, :value3}]
|> Enum.group_by(&elem(&1, 0), &elem(&1, 1))
#⇒ %{key: [:value, :value2], key2: [:value3]}