如何在elixir中转换此列表
[
%{key1: 1, key2: 2, key3: 3},
%{key1: 4, key2: 5, key3: 6},
%{key1: 7, key2: 8, key3: 9}
]
Run Code Online (Sandbox Code Playgroud)
到这张地图
%{key1: [1, 4, 7], key2: [2, 5, 8], key3: [3, 6, 9])
Run Code Online (Sandbox Code Playgroud)
?
你可以两次通过; 第一个将所有内容展平为单个一维的键值对列表,然后第二个按键组合.
input = [
%{key1: 1, key2: 2, key3: 3},
%{key1: 4, key2: 5, key3: 6},
%{key1: 7, key2: 8, key3: 9}
]
input
|> Enum.flat_map(fn m -> Map.to_list(m) end)
|> Enum.group_by(fn {k, _} -> k end, fn {_, v} -> v end)
Run Code Online (Sandbox Code Playgroud)
产量
%{key1: [1, 4, 7], key2: [2, 5, 8], key3: [3, 6, 9]}
Run Code Online (Sandbox Code Playgroud)
Enum.reduce(input, %{key1: [], key2: [], key3: []}, fn m, acc ->\n Map.merge(acc, m, fn _k, v1, v2 -> v1 ++ [v2] end)\nend)\n#\xe2\x87\x92\xc2\xa0%{key1: [1, 4, 7], key2: [2, 5, 8], key3: [3, 6, 9]}\nRun Code Online (Sandbox Code Playgroud)\n\n或者,没有预先硬编码的累加器:
\n\nEnum.reduce(input, %{}, fn m, acc ->\n Map.merge(acc, m, fn\n _k, v1, v2 when is_list(v1) ->\n :lists.reverse([v2 | :lists.reverse(v1)])\n _k, v1, v2 -> [v1, v2]\n end)\nend)\n#\xe2\x87\x92\xc2\xa0%{key1: [1, 4, 7], key2: [2, 5, 8], key3: [3, 6, 9]}\nRun Code Online (Sandbox Code Playgroud)\n