【问题标题】:Elixir filter map entries by a conditionalElixir 按条件过滤映射条目
【发布时间】:2021-09-08 11:58:34
【问题描述】:

我在 Elixir 中有一个 Map,它从字符串键映射到一个属性列表的值。如何在我通过 Map 枚举时删除不符合条件的项目?

地图是这样的:

%{"A" => [needed: true], "B" => [needed: false]}

在这种情况下,我会检查每个键/值对并只保留需要的那些:true

到目前为止,我已经尝试过使用 Enum.map 和 Enum.each 的不同组合。

【问题讨论】:

    标签: dictionary filter elixir


    【解决方案1】:

    当您需要从 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]}
    

    【讨论】:

    • 我会使用Map.new() 而不是Enum.into(%{}),我相信它也更快。
    • 啊,Enum.into 似乎在今年 6 月得到了改进,所以他们现在可能正在做同样的事情:github.com/elixir-lang/elixir/commit/…
    【解决方案2】:

    这不是非常惯用的 Elixir,但作为 Dogbert pointed out,也可以直接使用 :maps.filter/2 执行此操作,避免中间列表:

    iex(2)> :maps.filter(fn _, v -> Keyword.get(v, :needed) end, map)
    %{"A" => [needed: true]}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-26
      • 2018-11-12
      • 2014-12-30
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多