我如何在Elixir Map中提取值

dev*_*vie 3 elixir

假设我有这个

%{
  "contact_full_name" => ["Jane", "Joe", "Job"],
  "contact_mobile_number" => ["1234", "5678", "9012"],
  "contact_relationship" => ["sibling", "stuff", "stuff"]
}
Run Code Online (Sandbox Code Playgroud)

我如何迭代通过地图,获取 "jane, 1234, sibling""Jone, "5678", "stuff"

尝试使用

Enum.each(contact, fn {k, v} ->
  IO.puts("#{k} --> #{v}")
end)
Run Code Online (Sandbox Code Playgroud)

但这产生了

contact_full_name --> JaneJoeJob
contact_mobile_number --> 123456789012
contact_relationship --> siblingstuffstuff
Run Code Online (Sandbox Code Playgroud)

Dar*_*ght 6

您可以使用提取地图值Map.values/1,然后使用压缩列表值Enum.zip/1

contact_details = %{
  "contact_full_name"     => ["Jane", "Joe", "Job"],
  "contact_mobile_number" => ["1234", "5678", "9012"],
  "contact_relationship"  => ["sibling", "stuff", "stuff"]
}

contact_details |> Map.values() |> Enum.zip()
Run Code Online (Sandbox Code Playgroud)

这样产生:

[
  {"Jane", "1234", "sibling"},
  {"Joe", "5678", "stuff"},
  {"Job", "9012", "stuff"}
]
Run Code Online (Sandbox Code Playgroud)

但是,请注意,这将返回一个元组列表。您可以使用以下附加步骤将元组转换为列表,以使用以下步骤映射和转换元组Tuple.to_list/1

contact_details 
|> Map.values() 
|> Enum.zip() 
|> Enum.map(&Tuple.to_list/1)
Run Code Online (Sandbox Code Playgroud)

产生:

[
  ["Jane", "1234", "sibling"],
  ["Joe", "5678", "stuff"],
  ["Job", "9012", "stuff"]
]
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)