Хотя 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}]