如何将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
相关产品推荐
相关产品推荐

