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
Erlang 长生不老药累加器地图列表_Erlang_Elixir - Fatal编程技术网

Erlang 长生不老药累加器地图列表

Erlang 长生不老药累加器地图列表,erlang,elixir,Erlang,Elixir,你能帮我实现地图列表中的一个累加器吗 [ %{ score: 1, name: "Javascript", }, %{ score: 2, name: "Elixir", }, %{ score: 10, name: "Elixir", } ] 结果应该是: [ %{ score: 12, name: "Elixir", }, %{ score: 1,

你能帮我实现地图列表中的一个累加器吗

[
 %{
    score: 1,
    name: "Javascript",
 },
 %{
    score: 2,
    name: "Elixir",
 },
 %{
    score: 10,
    name: "Elixir",
 }
]
结果应该是:

[
    %{
        score: 12,
        name: "Elixir",
    },
    %{
        score: 1,
        name: "Javascript",
    }
]
谢谢你的建议


关于

假设您的原始列表存储在
输入
局部变量中,可以从用作减速机开始

Enum.reduce(输入,%{},fn%{score:score,name:name},acc->
地图更新(acc、名称、分数和1+分数)
(完)
#⇒%{“长生不老药”=>12,“Javascript”=>1}
无论你是否坚持要有一个地图列表作为结果(这是IMSO可读性较差的一种方式),再进一步,结果是:

Enum.map(%%{“Elixir”=>12,“Javascript”=>1},fn{name,score}->
%{name:name,score:score}
(完)
#⇒[%{姓名:“长生不老药”,分数:12},
#%{name:“Javascript”,分数:1}]

总而言之:

输入
|>Enum.reduce(%{},fn%{分数:分数,名称:名称},acc->
地图更新(acc、名称、分数和1+分数)
(完)
|>map(&%{name:elem(&1,0),score:elem(&1,1)})
#⇒[%{姓名:“长生不老药”,分数:12},
#%{name:“Javascript”,分数:1}]

旁注:中的贴图(因此,中的贴图)没有顺序。这意味着,如果希望结果列表按
名称
,或按
分数
排序,则应明确指出:

Enum.sort(…,&&1.score>&2.score)
#⇒[%{姓名:“长生不老药”,分数:12},
#%{name:“Javascript”,分数:1}]

一种简单的方法是使用名称对项目进行分组,然后对分数进行求和:

列表
|>枚举分组依据(&&1.name,&&1.score)
|>map(fn{name,score}->%{name:name,score:Enum.sum(score)}end)
输出:

[%{name:“长生不老药”,分数:12},%{name:“Javascript”,分数:1}]

如果您希望创建和使用更通用的解决方案,您可以创建自己的合并模块

defdo
def merge_by(可枚举,name_fun,merge_fun)do
可枚举
|>枚举分组人(名称)
|>map(fn{u name,items}->Enum.reduce(items,merge\u fun)end)
终止
终止
列表=[
%{score:1,name:“Javascript”},
%{分数:2,名字:“长生不老药”},
%{分数:10,名字:“长生不老药”}
]
merge.merge_by(list,&&1.name,&%{&1 | score:&1.score+&2.score})
#=>[%{name:“长生不老药”,分数:12},%{name:“Javascript”,分数:1}]

当你问这些问题时,你应该分享你所做的任何研究和你已经尝试过的任何代码。现在看来(毫无疑问,这是错误的),你在这里发布之前并没有努力解决自己的问题。再次感谢