Elixir如何遍历map列表并对嵌套字段累加且保留原有属性?
实现方案
你出现外层属性丢失的核心原因是修改字段时没有复用原有外层map,而是手动构造了仅包含a、b字段的新map,改用Elixir内置的map更新逻辑即可解决,以下是可直接运行的实现:
写法1:Enum.reduce + Map.put 通用写法
result = Enum.map(a, fn outer_map -> # 计算嵌套c列表的x、y总和 sum_c = Enum.reduce(outer_map.c, 0, fn %{x: x, y: y}, acc -> acc + x + y end) # 仅更新c字段,保留原map所有其他属性 Map.put(outer_map, :c, sum_c) end)
写法2:推导式+管道符 简洁写法
result = for %{c: c_list} = outer_map <- a do sum_c = c_list |> Enum.map(&(&1.x + &1.y)) |> Enum.sum() # Elixir原生map更新语法,仅修改指定键值 %{outer_map | c: sum_c} end
两种写法输出的结果完全符合你的预期:
[ %{a: 1, b: 2, c: 8}, %{a: 3, b: 4, c: 10}, %{a: 5, b: 6, c: 14} ]
内容的提问来源于stack exchange,提问作者user17139608
相关产品推荐
相关产品推荐

