elixir - 在 Elixir 中按几个值映射分组
问题描述
所以我有这张地图
map = [
%{id: 2, brand: "TUTU", reference: "1234"},
%{id: 2, brand: "TUTU", reference: "4567"},
%{id: 3, brand: "TOTO", reference: "789456"}
]
我想按 ID 对它进行分组以获得这样的结果:
[
%{
id: 2,
brand: "TUTU",
reference: [
"1234",
"5845"
]
},
%{
id: 3,
brand: "TOTO",
reference: [
"4587"
]
}
]
我试着Enum.group_by
像这样使用
map
|> Enum.group_by(fn entry -> entry.brand end)
但结果看起来像这样:
%{
"TOTO" => [%{brand: "TOTO", id: 3, reference: "789456"}],
"TUTU" => [
%{brand: "TUTU", id: 2, reference: "1234"},
%{brand: "TUTU", id: 2, reference: "4567"}
]
}
我觉得我很接近解决方案,但我不知道如何将我的信息重新组合到列表中,而不是将键用作索引....
对不起,我不是很清楚,我只是不知道如何描述我的问题
解决方案
另一种可能性是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()
推荐阅读
- xamarin - Xamarin.Forms UWP 项目是否支持 Lottie 动画?
- java - 在while循环中输入带有System.out.format的命令
- gradle - Gradle:BuildListener#buildStarted(Gradle) 已被弃用
- python-3.x - 在 WSL 上配置 Tor + Selenium 以进行网络抓取
- pattern-matching - Elixir 模式匹配解释
- c# - 在 c# 中解压缩 gz 文件:System.IO.InvalidDataException:'存档条目是使用不受支持的压缩方法压缩的。'
- flutter - 未来
- >>' 不能分配给参数类型 'List
- python - Python 中用于导入的默认参数
- javascript - javascript中的作用域链和全局对象
- python - 如何从 Python 制作作为另一个 C 函数和 Python 函数参数的闭包的 C 函数指针