Эликсир - объединить элементы списка - PullRequest
1 голос
/ 27 марта 2020

У меня есть список

extensions = [
  [
    %{extension: "zip", size: 3627, type: "archives"},
    %{extension: "xml", size: 3627, type: "documents"}
  ],
  [
    %{extension: "png", size: 458605, type: "graphics"},
    %{extension: "png", size: 458605, type: "graphics"}
  ]
]

Мне нужно объединить элементы списка, чтобы получить:

extensions = [
    %{extension: "zip", size: 3627, type: "archives"},
    %{extension: "xml", size: 3627, type: "documents"},
    %{extension: "png", size: 458605, type: "graphics"},
    %{extension: "png", size: 458605, type: "graphics"}
]

Я не могу найти правильное решение. Буду благодарен за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 27 марта 2020

Хотя ответ, предоставленный @Daniel, является совершенно правильным в данном конкретном случае, нужно соблюдать осторожность с List.flatten/1, поскольку сильно выравнивает . Точный ответ на поставленный вопрос был бы

extensions
|> :lists.reverse()
|> Enum.reduce(&++/2)

Чтобы понять разницу, давайте рассмотрим, что у нас есть следующие данные:

#                         ⇓⇓⇓
extensions = [[1, 2], [3, [4]]]

List.flatten(extensions)
#⇒ [1, 2, 3, 4]

extensions |> :lists.reverse() |> Enum.reduce(&++/2)
#⇒ [1, 2, 3, [4]]
3 голосов
/ 27 марта 2020

Вы можете использовать List.flatten/1:

iex> List.flatten(extensions)
[
  %{extension: "zip", size: 3627, type: "archives"},
  %{extension: "xml", size: 3627, type: "documents"},
  %{extension: "png", size: 458605, type: "graphics"},
  %{extension: "png", size: 458605, type: "graphics"}
]
...