如何展平地图列表?

时间:2018-03-25 03:55:18

标签: elixir

我正在做" map"在一个集合上并找回一张地图列表:

   res1 = Enum.map(my_collection, fn a ->
     %{a.id => get_some_data(a)}
   end) 

   # =>     [%{1 => 123}, %{2 => 456}]

如何展平地图列表 - res1 - 以便我拥有:

%{1 => 123, 2 => 456}

2 个答案:

答案 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/2Kernel.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}