【问题标题】:How do I write the function to pass to Enum.map when enumerating a map?枚举地图时如何编写传递给 Enum.map 的函数?
【发布时间】:2022-04-13 01:11:58
【问题描述】:
iex(121)> val_map = %{"pri" => %{"tit" => "name1"}}
iex(122)> fp = fn (new_map) -> Map.get(new_map, "pri") end

以下会引发错误

iex(123)> Enum.each(val_map, fp)
** (BadMapError) expected a map, got: {"pri", %{"tit" => "name1"}}
    (elixir) lib/map.ex:437: Map.get({"pri", %{"tit" => "name1"}}, "pri", nil)
    (elixir) lib/enum.ex:771: anonymous fn/3 in Enum.each/2
    (stdlib) maps.erl:257: :maps.fold_1/3
    (elixir) lib/enum.ex:1941: Enum.each/2

【问题讨论】:

    标签: elixir


    【解决方案1】:

    很难从你的代码中看出你的目标是什么,也许你只是在尝试Enum,但也许Map.values/1在这里是更好的选择?

    iex(1)> val_map = %{"pri" => %{"tit" => "name1"}, "sec" => %{"tat" => "name2"}}
    %{"pri" => %{"tit" => "name1"}, "sec" => %{"tat" => "name2"}}
    iex(2)> Map.values(val_map)
    [%{"tit" => "name1"}, %{"tat" => "name2"}]
    

    响应cmets中的澄清,可以这样操作:

    iex(1)> val_map = %{"pri" => %{"tit" => "name1"}, "sec" => %{"tit" => "name2"}}
    %{"pri" => %{"tit" => "name1"}, "sec" => %{"tit" => "name2"}}
    iex(2)> Enum.map(val_map, fn {k, %{"tit" => v}} -> %{k => v} end)
    [%{"pri" => "name1"}, %{"sec" => "name2"}]
    

    【讨论】:

    • 目标是获取 key "tit" val_map = %{"pri" => %{"tit" => "name1"}, "sec" => %{"tit" => "name2"} 所以最终结果应该是这样的: [%{"pri" => "name1"}, %{"sec" => "name2"}]
    • @navyad: Enum.map(val_map, fn {k, %{"tit" => v}} -> %{k => v} end)
    【解决方案2】:

    当您遍历 Map 时,它会将其转换为关键字列表(即您使用元组):

    Enum.each  %{a: 1, b: 2, c: 3},  fn {key, value} ->
      IO.puts "#{key} : #{value}"
    end 
    

    在您的情况下,您需要匹配元组的 key 部分:

    val_map = %{"pri" => %{"tit" => "name1"}}
    fp = fn ({"pri", value}) -> value; {other_key, value} -> value end
    

    在第二部分中,您可以对值执行其他操作:转换、不返回等。

    在这种情况下,它将从您的初始地图返回一个地图(值)数组:

    Enum.each(val_map, fp)
    # [%{"tit" => "name1"}]
    

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多