Elixir - 合并列表元素

Elixir - merge list elements

我有一个列表

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"}
]

我找不到合适的解决方案。我将不胜感激。

您可以使用 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"}
]

虽然@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]]