如何减少Elixir中的地图列表

时间:2018-01-02 14:18:25

标签: elixir

我有一个我想要减少的地图列表,因为它通常包含名称重复,但我不能只使用Enum.uniq因为我想要加上count-column,例如:

list = [%{count: 4, name: "first"}, %{count: 43, name: "second"}, 
%{count: 11, name: "third"}, %{count: 11, name: "first"},
%{count: 11, name: "second"}, %{count: 28, name: "second"}]

我之后的结果是:

[%{count: 15, name: "first"}, %{count: 82, name: "second"}, %{count: 11, name: "third"}]

找到这个步骤后:How to map and reduce List of Maps in Elixir

我想出了类似的东西;

  all_maps
  |> Enum.group_by(&(&1.name))
  |> Enum.map(fn {key, value} ->
%{name: key, count: value |> Enum.reduce(fn(x, acc) -> x.count + acc.count end)}
end)

但它只在有多个具有相同名称的情况下才有效,上面的列表会给出这个结果:

[%{count: 15, name: "first"}, %{count: 82, name: "second"}, %{count: %{count: 11, name: "third"}, name: "third"}]

有时它只是一个所以我需要一些适用于这两种情况的东西,任何提示?

1 个答案:

答案 0 :(得分:0)

问题在于Enum.reduce/3。当列表只有一个值时,它返回该值。我会这样做:

%{name: key, count: value |> Enum.map(& &1.count) |> Enum.sum()}