You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Map列表合并为单个Map并合并重复键对应值?

解决方法:用Enum.reduce累积合并结果

在Elixir里处理这种不可变数据的合并需求,Enum.reduce/3是最顺手的工具——毕竟函数式编程的核心不是修改现有数据,而是逐步构建新的结果。

直接上可运行的代码示例:

some_maps = [%{"test" => [1]}, %{"test2" => [2]}, %{"test" => [3]}]

single_map = Enum.reduce(some_maps, %{}, fn current_map, acc ->
  Map.merge(acc, current_map, fn _key, val1, val2 -> val1 ++ val2 end)
end)

# 最终输出:%{"test" => [1, 3], "test2" => [2]}

代码细节解释:

  • Enum.reduce(some_maps, %{}, fn ... end):我们以空Map%{}作为初始的累积值(也就是代码里的acc,accumulator的缩写),然后逐个遍历some_maps里的每个current_map。
  • Map.merge/3:这个函数负责合并两个Map,第三个参数是冲突处理函数——当遇到相同键的时候,我们把两个键对应的列表直接拼接起来(val1 ++ val2),完美实现重复键值的合并。

如果你的场景里,Map的值可能偶尔不是列表(比如某个元素是%{"test" => 4}这种单个值),可以稍微调整冲突函数,先把值统一转成列表再合并:

fn _key, val1, val2 -> List.wrap(val1) ++ List.wrap(val2) end

这样就能兼容单个值的情况,合并后得到[1,3,4]这类结果。

内容的提问来源于stack exchange,提问作者lapinkoira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:56:57