我正在做" map"在一个集合上并找回一张地图列表:
res1 = Enum.map(my_collection, fn a ->
%{a.id => get_some_data(a)}
end)
# => [%{1 => 123}, %{2 => 456}]
如何展平地图列表 - res1 - 以便我拥有:
%{1 => 123, 2 => 456}
答案 0 :(得分:3)
这里最简单的方法是在地图中构建关键字列表:
coll
|> Enum.map(fn a -> {a.id, get_some_data(a)} end)
|> Map.new
或者:
for a <- coll, id = a.id, data = get_some_data(a), into: %{} do
{id, data}
end
问题是你在每次迭代时都在构建一个地图,而不是建立一个键/值对,这就是关键字列表/地图的构成。
答案 1 :(得分:2)
虽然Enum.map/2
和Kernel.SpecialForms.for/1
完美地完成了他们的工作,但也有可能通过Enum.reduce/3
获得相同的结果:
iex|1 ▶ input = [%{id: 1, data: :foo}, %{id: 2, data: :bar}]
#⇒ [%{data: :foo, id: 1}, %{data: :bar, id: 2}]
iex|2 ▶ Enum.reduce(input, %{}, fn e, acc ->
...|2 ▷ Map.put(acc, e.id, e.data)
...|2 ▷ end)
#⇒ %{1 => :foo, 2 => :bar}