根据数值在两张地图中选择

问题描述 投票:0回答:1

我有这个数据集。

%{
  "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 会工作,但我还没有任何运气。任何帮助将是巨大的。

elixir phoenix-framework
1个回答
4
投票

您想使用"... 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}}

1
投票

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/1Map.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}}
© www.soinside.com 2019 - 2024. All rights reserved.