Как извлечь значения из карты Elixir - PullRequest
3 голосов
/ 29 апреля 2019

Предполагая, что у меня есть это

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

Как перебрать эту карту, получив "jane, 1234, sibling", "Jone, "5678", "stuff" и т. Д.

Попробовал с помощью

Enum.each(contact, fn {k, v} ->
  IO.puts("#{k} --> #{v}")
end)

но это производит

contact_full_name --> JaneJoeJob
contact_mobile_number --> 123456789012
contact_relationship --> siblingstuffstuff

1 Ответ

6 голосов
/ 30 апреля 2019

Вы можете извлечь значения карты с помощью 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()

Это дает:

[
  {"Jane", "1234", "sibling"},
  {"Joe", "5678", "stuff"},
  {"Job", "9012", "stuff"}
]

Однако обратите внимание, что это возвращает список кортежей.Вы можете преобразовать кортежи в списки с дополнительным шагом для отображения и преобразования кортежей с помощью Tuple.to_list/1:

contact_details 
|> Map.values() 
|> Enum.zip() 
|> Enum.map(&Tuple.to_list/1)

, что дает:

[
  ["Jane", "1234", "sibling"],
  ["Joe", "5678", "stuff"],
  ["Job", "9012", "stuff"]
]

Надеюсь, это поможет:)

...