Elixir 如何按指定条件过滤Map中的键值对条目
Elixir 过滤符合条件的Map条目实现方案
你可以直接使用Map.filter/2或者Enum.filter/2配合Map.new/0实现需求,不需要组合Enum.map和Enum.each:
Enum.each仅用于执行副作用,返回值固定为:ok,无法得到处理后的集合Enum.map用于对等转换所有集合元素,不适合直接做过滤操作
最简实现(Elixir 1.13+ 推荐)
直接调用原生Map.filter/2方法:
input_map = %{"A" => [needed: true], "B" => [needed: false]} result = Map.filter(input_map, fn {_key, attrs} -> attrs[:needed] end)
运行后result的值为%{"A" => [needed: true]},完全符合预期。
全版本兼容实现
如果使用低于1.13的Elixir版本,先过滤枚举再转换为Map即可:
input_map = %{"A" => [needed: true], "B" => [needed: false]} result = input_map |> Enum.filter(fn {_key, attrs} -> attrs[:needed] end) |> Map.new()
边界情况处理
如果部分条目的属性列表可能不存在:needed键,可以设置默认值避免逻辑异常:
# 不存在:needed属性的条目默认判定为不符合条件,会被过滤 Map.filter(input_map, fn {_key, attrs} -> Keyword.get(attrs, :needed, false) end)
内容的提问来源于stack exchange,提问作者William Ross
相关产品推荐
相关产品推荐

