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]}