如何使用Enum.reduce合并Elixir列表中同name字段的ids列表
使用 Enum.reduce 实现按name合并ids的方案
实现思路是用Map作为Enum.reduce的累加器,以name作为键存储对应合并后的ids数组,遍历完所有元素后再将Map转换为目标结构的列表即可。
示例输入:
input = [ %{ids: ["A123"], name: "Red"}, %{ids: ["A123"], name: "Blue"}, %{ids: ["B123"], name: "Blue"} ]
实现代码:
result = input |> Enum.reduce(%{}, fn %{name: name, ids: ids}, acc -> # 累加器中存在对应name则合并ids,不存在则直接存入 Map.update(acc, name, ids, &(&1 ++ ids)) end) # 将累加器Map转换为要求的列表结构 |> Enum.map(fn {name, ids} -> %{name: name, ids: ids} end)
运行后得到的result即为目标结构:
[ %{ids: ["A123"], name: "Red"}, %{ids: ["A123", "B123"], name: "Blue"} ]
如果需要对合并后的ids去重,可将合并逻辑调整为&(Enum.uniq(&1 ++ ids))即可。
内容的提问来源于stack exchange,提问作者Surendra Bharathi
相关产品推荐
相关产品推荐

