Elixir Enum,过滤器和组

时间:2017-05-07 08:38:01

标签: enums elixir

Elixir中最优雅的转化方式

[["A","B","foo"],["A","B","bar"],["A","B","baz"],["C","D","foobar"],["C","D","bla"],["E","F","blabla"]]

成:

[["A","B","foo","bar","baz"],["C","D","foobar","bla"],["E","F","blabla"]]

基本上我想迭代输入列表并按前两个元素进行分组。

1 个答案:

答案 0 :(得分:2)

我按Enum.take(2)分组,然后flat_map分组Enum.drop(2)

[["A","B","foo"],["A","B","bar"],["A","B","baz"],["C","D","foobar"],["C","D","bla"],["E","F","blabla"]]
|> Enum.group_by(&Enum.take(&1, 2))
|> Enum.map(fn {key, value} ->
  key ++ Enum.flat_map(value, &Enum.drop(&1, 2))
end)
|> IO.inspect

输出:

[["A", "B", "foo", "bar", "baz"], ["C", "D", "foobar", "bla"],
 ["E", "F", "blabla"]]

请注意,如果输入列表中的任何项目具有> 3个要素;在这种情况下,它只会连接它们:

[["A","B","foo","z","zz"],["A","B","bar"],["A","B","baz"],["C","D","foobar"],["C","D","bla"],["E","F","blabla"]]

将输出:

[["A", "B", "foo", "z", "zz", "bar", "baz"], ["C", "D", "foobar", "bla"],
 ["E", "F", "blabla"]]