我有一个这样的列表:
[
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077790705827"],
["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538078530667847"],
["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538077778390908"],
["5b71d7e458c37fa04a7ce768","5bad45b1e990057961313822","1538082492283531"]
]
Run Code Online (Sandbox Code Playgroud)
我想将其转换为如下列表:
[
{"5b3f77502dfe0deeb8912b42",
[{"5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42", "1538077790705827"},
{"5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42", "1538078530667847"},
{"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42" ,"1538077778390908"}
]},
{"5bad45b1e990057961313822",
[{"5b71d7e458c37fa04a7ce768","5bad45b1e990057961313822","1538082492283531"}
]}
]
Run Code Online (Sandbox Code Playgroud)
所以关键是从原始列表中的第二项创建元组
[“5b71d7e458c37fa04a7ce768”,“5b3f77502dfe0deeb8912b42”,“1538077790705827”],
首先,Enum.group_by列表的第二个元素。然后,将生成的映射值的每个值映射到List.to_tuple。Enum.map与映射一起使用时,会自动将每个键/值对转换为元组。
list = [
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077790705827"],
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538078530667847"],
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077778390908"],
["5b71d7e458c37fa04a7ce768", "5bad45b1e990057961313822", "1538082492283531"]
]
list
|> Enum.group_by(&Enum.at(&1, 1))
|> Enum.map(fn {k, v} -> {k, Enum.map(v, &List.to_tuple/1)} end)
|> IO.inspect
Run Code Online (Sandbox Code Playgroud)
输出:
[
{"5b3f77502dfe0deeb8912b42",
[
{"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42",
"1538077790705827"},
{"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42",
"1538078530667847"},
{"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42",
"1538077778390908"}
]},
{"5bad45b1e990057961313822",
[
{"5b71d7e458c37fa04a7ce768", "5bad45b1e990057961313822",
"1538082492283531"}
]}
]
Run Code Online (Sandbox Code Playgroud)