elixir-地图结构上的图案匹配,而不是键

  • 本文关键字:结构上 地图 elixir- elixir
  • 更新时间 :
  • 英文 :


在elixir中,我有一个嵌套地图列表,每个列表都具有相同的基本结构 - 例如:

nested_map_list = [
    %{foo: %{test: "Hi"}},
    %{bar: %{test: "Hello"}},
    %{baz: %{test: "Hey"}}
]

因此,它们每个都在上层具有不同的键,但是嵌套地图中的键相同。有什么方法可以在此列表上迭代,以便每个迭代访问嵌套地图,而不管上层中的密钥如何?

为了说明我的意思,请考虑此伪代码:

Enum.each(nested_map_list, fn(%{_key: nested_data}) -> IO.puts nested_data.test end)
> "Hi"
> "Hello"
> "Hey"

非常感谢!

虽然其他答案都正确,但我在这里使用 for和模式匹配:

iex(1)> nested_map_list = [
...(1)>   %{foo: %{test: "Hi"}},
...(1)>   %{bar: %{test: "Hello"}},
...(1)>   %{baz: %{test: "Hey"}}
...(1)> ]
iex(2)> for x <- nested_map_list, {_, %{test: test}} <- x, do: IO.puts(test)
Hi
Hello
Hey

Enum.reduceEnum.each和朋友能够在 key=>value pairs上迭代,因此在这种情况下,我可能会将其分为两个函数,一个在列表成员上迭代,一个迭代,一个迭代的功能在地图上。如果要存储结果(通常需要的(,则需要减少而不是Enum.each

Enum.each(nested_map_list, fn(element) ->
    Enum.each(element, fn({_k, value}) ->
        IO.inspect(value[:test])
    end)
end)

哦,这是我刚刚解决的一种可能性 -

Enum.each(nested_map_list, fn(nested_data) ->
  [{key, value}] = Map.to_list(nested_data)
  IO.puts value.test
end)

开放任何较差的答案。

最新更新