Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Elixir中汇总地图列表中不同键的值_Elixir_Reduce - Fatal编程技术网

如何在Elixir中汇总地图列表中不同键的值

如何在Elixir中汇总地图列表中不同键的值,elixir,reduce,Elixir,Reduce,您好,我想将所有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

您好,我想将所有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()
我得到这个结果:

#ouput: 
%{count: 10, val: 10}
%{count: 10, val: 35}
但我需要这个结果:

#ouput: 
%{count: 10, val: 10}
%{count: 10, val: 35}
我只知道如何总结一个关键点。我应该将这些键分别归纳为两个函数吗?考虑到列表中会有更多的值/映射,或者可能会有更多的键,我认为这并没有表现出来。
有没有一种有效的方法可以一次总结所有的关键点?

我想这就是你想要的

Enum.reduce(list, %{count: 0, val: 0}, fn %{count: count, val: val}, acc ->
  %{count: acc.count + count, val: acc.val + val}
end)
可以使用,因为列表元素和累积值的格式相同。诀窍是使用整个map
%{count:count,val:val}
作为累加器,而不仅仅是一个整数:

Enum.reduce(列表,fn项,附件->
%{count:item.count+acc.count,val:item.val+acc.val}
(完)

我会将初始列表减少

Enum.reduce(列表和映射合并(&1和&2,fn\uv1和v2->v1+v2结束))
#⇒ %{计数:10,val:35}

初始累加器在这里是多余的,请改用。是的,但我认为这取决于您是否需要处理空的情况,在这种情况下,
reduce/2
无法推断初始累加器?(
在enumerable为空时引发Enum.EmptyError。
)使用合并冲突解决方案并不比只求和值简单。它更短,更容易扩展到100个键的情况,并且不依赖于键名称,因此更容易重构。有足够的理由投票支持它。