Elixir 按条件过滤映射条目
Elixir filter map entries by a conditional
我在 Elixir 中有一个映射,它从字符串键映射到一个值,该值是一个属性列表。如何删除不符合条件的项目,我通过地图枚举?
地图是这样的:
%{"A" => [needed: true], "B" => [needed: false]}
在这种情况下,我会检查每个 key/value 对,只保留需要的对:true
到目前为止,我尝试过使用 Enum.map 和 Enum.each 进行不同的组合。
当您需要从像 Map 这样的可枚举对象中过滤值时,Enum.filter/2 是您的朋友。诀窍是您需要将结果“重新组装”回地图。
%{"A" => [needed: true], "B" => [needed: false]}
|> Enum.filter(fn {_, v} -> Keyword.get(v, :needed) end)
|> Enum.into(%{})
# Result:
%{"A" => [needed: true]}
这不是很惯用的 Elixir,但作为 Dogbert , it's also possible to do this directly with :maps.filter/2
,避免了中间列表:
iex(2)> :maps.filter(fn _, v -> Keyword.get(v, :needed) end, map)
%{"A" => [needed: true]}
我在 Elixir 中有一个映射,它从字符串键映射到一个值,该值是一个属性列表。如何删除不符合条件的项目,我通过地图枚举?
地图是这样的:
%{"A" => [needed: true], "B" => [needed: false]}
在这种情况下,我会检查每个 key/value 对,只保留需要的对:true
到目前为止,我尝试过使用 Enum.map 和 Enum.each 进行不同的组合。
当您需要从像 Map 这样的可枚举对象中过滤值时,Enum.filter/2 是您的朋友。诀窍是您需要将结果“重新组装”回地图。
%{"A" => [needed: true], "B" => [needed: false]}
|> Enum.filter(fn {_, v} -> Keyword.get(v, :needed) end)
|> Enum.into(%{})
# Result:
%{"A" => [needed: true]}
这不是很惯用的 Elixir,但作为 Dogbert :maps.filter/2
,避免了中间列表:
iex(2)> :maps.filter(fn _, v -> Keyword.get(v, :needed) end, map)
%{"A" => [needed: true]}