所以我有这张地图
map = [
%{id: 2, brand: "TUTU", reference: "1234"},
%{id: 2, brand: "TUTU", reference: "4567"},
%{id: 3, brand: "TOTO", reference: "789456"}
]
Run Code Online (Sandbox Code Playgroud)
我想按ID将其分组以获得类似以下内容:
[
%{
id: 2,
brand: "TUTU",
reference: [
"1234",
"5845"
]
},
%{
id: 3,
brand: "TOTO",
reference: [
"4587"
]
}
]
Run Code Online (Sandbox Code Playgroud)
我试图用Enum.group_by
这样
map
|> Enum.group_by(fn entry -> entry.brand end)
Run Code Online (Sandbox Code Playgroud)
但是结果看起来像这样:
%{
"TOTO" => [%{brand: "TOTO", id: 3, reference: "789456"}],
"TUTU" => [
%{brand: "TUTU", id: 2, reference: "1234"},
%{brand: "TUTU", id: 2, reference: "4567"}
]
}
Run Code Online (Sandbox Code Playgroud)
我觉得我已经接近解决方案了,但是我不知道如何将信息重新分组到列表中,而不是将键用作索引。
对不起,我不太清楚,我只是不知道该如何形容我的问题
另一种可能性是使用以下命令Enum.reduce/3
直接进入所需的结构Kernel.update_in/3
:
data
|> Enum.reduce(%{}, fn %{id: id, brand: brand, reference: ref}, acc ->
update_in(acc, [{id, brand}], fn
nil -> %{id: id, brand: brand, reference: [ref]}
refs -> %{refs | reference: [ref | refs.reference]}
end)
end)
|> Map.values()
Run Code Online (Sandbox Code Playgroud)