我有这个数据集。
%{
"away" => %{
"id" => "575ec304-wlk3-239n-3032jdns3944",
"points" => 115
},
"home" => %{
"id" => "583ec7cd-fb46-11e1-82cb-f4ce4684ea4c",
"points" => 120
}
}
我想返回点最多的地图 所以我的结果是这样的。
%{
"home" => %{
"id" => "583ec7cd-fb46-11e1-82cb-f4ce4684ea4c",
"points" => 120
}
}
我在想 enum.find
会工作,但我还没有任何运气。任何帮助将是巨大的。
您想使用"... Enum.max_by/4
因为你不需要搜索物品的特定属性,而是想要拥有最多积分的物品本身。
iex> data = %{
"away" => %{
"id" => "575ec304-wlk3-239n-3032jdns3944",
"points" => 115
},
"home" => %{
"id" => "583ec7cd-fb46-11e1-82cb-f4ce4684ea4c",
"points" => 120
}
}
iex> Enum.max_by(data, fn {_, value} -> value["points"] end)
{"home", %{"id" => "583ec7cd-fb46-11e1-82cb-f4ce4684ea4c", "points" => 120}}
而 Enum.max_by/4
在这里可能看起来很合适,但最有效的解决方案将是使用普通的老式的好 Enum.reduce/3
的从句。
input = %{ ... }
Enum.reduce(input, nil, fn
{_, %{"points" => pe}}, {_, %{"points" => pa}} = acc when pa > pe -> acc
e, _ -> e
end)
#⇒ {"home", %{"id" => "583ec7cd-fb46-11e1-82cb-f4ce4684ea4c", "points" => 120}}
为了从元组回到映射,我们可以将结果用 List.wrap/1
和 Map.new/1
input
|> Enum.reduce(nil, fn
{_, %{"points" => pe}}, {_, %{"points" => pa}} = acc when pa > pe -> acc
e, _ -> e
end)
|> List.wrap()
|> Map.new()
#⇒ %{"home" => %{"id" => "583ec7cd-fb46-11e1-82cb-f4ce4684ea4c", "points" => 120}}