在Elixir中将集合转换为地图

时间:2019-05-29 08:47:10

标签: elixir

如果我有以下表格的集合:

[{key, value}, {key, value2}, {key2, value3}]

如何将其转换为表单的地图

%{key => [value, value2], key2 => [value3]}

1 个答案:

答案 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]}