Преобразовать хеш с целыми числами в список с хешами - PullRequest
0 голосов
/ 11 февраля 2019

Какой оптимальный способ преобразовать этот хеш:

%{
    "0" => [
        %{"foo" => 1, "baz" => 10}
    ], 
    "1" => [
        %{"foo" => 2, "baz" => 11}
    ]
}

в такой список?

[
    %{"foo" => 1, "baz" => 10},
    %{"foo" => 2, "baz" => 11}
]

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Хотя Map.values/2 определенно будет работать, понимание Kernel.SpecialForms/1, вероятно, является более гибким способом, поскольку позволяет фильтровать и / или изменять результат вplace.

input = %{
  "0" => [
    %{"foo" => 1, "baz" => 10}
  ], 
  "1" => [
    %{"foo" => 2, "baz" => 11}
  ]
}

for {_, [map]} <- input, do: map
#⇒ [%{"baz" => 10, "foo" => 1}, %{"baz" => 11, "foo" => 2}]

Если вы ожидаете, что в каждом списке значений будет больше , чем один элемент, используйте Enum.reduce/3:

Enum.reduce(input, [], fn {_, maps}, acc -> acc ++ maps end)
#⇒ [%{"baz" => 10, "foo" => 1}, %{"baz" => 11, "foo" => 2}]

Другой возможностью будет использование Enum.flat_map/2:

Enum.flat_map(input, &elem(&1, 1))
#⇒ [%{"baz" => 10, "foo" => 1}, %{"baz" => 11, "foo" => 2}]

FWIW, решение с Map.values/1 (не рекомендуется):

input
|> Map.values()
|> Enum.flat_map(& &1)
#⇒ [%{"baz" => 10, "foo" => 1}, %{"baz" => 11, "foo" => 2}]
0 голосов
/ 11 февраля 2019
original = %{
    "0" => [
        %{"foo" => 1, "baz" => 10}
    ], 
    "1" => [
        %{"foo" => 2, "baz" => 11}
    ]
}

values_from_original = original |> Map.values

result = for e <- values_from_original, do: e |> Enum.at(0)
...