如何以优雅的方式将具有数组值的地图转换为字符串列表?

时间:2016-07-28 03:21:35

标签: elixir

我有一张地图(Ecto.Changeset的错误):

%{
  field_a: ["error 1", "error 2"],
  field_b: ["something here"]
}

我希望它成为

[
  "field_a error 1",
  "field_a error 2",
  "field_b something here"
]

我尝试用

实现它
Enum.map(map, fn({ key, errors }) ->
  # another anonymous function which generates strings
end)

但是自elixir doesn't support nested anonymous functions right now以来出现了编译错误。

如何实现此转换?

1 个答案:

答案 0 :(得分:3)

虽然您可以使用Enum.flat_map,但我相信for会更清楚:

errors = %{
  field_a: ["error 1", "error 2"],
  field_b: ["something here"]
}

formatted =
  for {field, messages} <- errors,
      message <- messages,
      do: "#{field} #{message}"

IO.inspect formatted

输出:

["field_a error 1", "field_a error 2", "field_b something here"]
  

但由于elixir现在不支持嵌套的匿名函数,因此出现了编译错误。

这是匿名递归函数; Elixir支持嵌套的匿名函数。