如何总结 Elixir 映射列表中不同键的值

fra*_*909 2 reduce elixir

您好,我想将所有count和所有val键汇总到一个包含两个键的累积值的新映射中。

这是我到目前为止所做的:

list = [
  %{count: 1, val: 12},
  %{count: 3, val: 7},
  %{count: 1, val: 5},
  %{count: 2, val: 3},
  %{count: 2, val: 5},
  %{count: 1, val: 3}
]

x = &%{count: &1, val: &1}
sumCount = list |> Enum.reduce(0, &(&1.count + &2)) |> x.() |> IO.inspect()
Run Code Online (Sandbox Code Playgroud)

我得到这个结果:

#ouput: 
%{count: 10, val: 10}
Run Code Online (Sandbox Code Playgroud)

但我需要这个结果:

%{count: 10, val: 35}
Run Code Online (Sandbox Code Playgroud)

我只知道如何总结一把钥匙。我应该分别总结两个功能中的键吗?我认为那不是高性能的,考虑到列表会有更多的值/映射或者更多的键。有没有一种有效的方法可以一次总结所有的键?

Jul*_*n C 5

我想这就是你要找的?

Enum.reduce(list, %{count: 0, val: 0}, fn %{count: count, val: val}, acc ->
  %{count: acc.count + count, val: acc.val + val}
end)
Run Code Online (Sandbox Code Playgroud)


Ada*_*hip 5

您可以使用Enum.reduce/2,因为您的列表元素和累积值的格式相同。诀窍是使用整个地图%{count: count, val: val}作为累加器,而不仅仅是一个整数:

Enum.reduce(list, fn item, acc ->
  %{count: item.count + acc.count, val: item.val + acc.val}
end)
Run Code Online (Sandbox Code Playgroud)


Ale*_*kin 5

我会选择将初始列表减少Map.merge/3

\n
Enum.reduce(list, &Map.merge(&1, &2, fn _, v1, v2 -> v1 + v2 end))\n#\xe2\x87\x92 %{count: 10, val: 35}\n
Run Code Online (Sandbox Code Playgroud)\n

  • 使用合并冲突解决并不比仅仅对值求和简单。 (2认同)