如何合并这2张Elixir地图:
foo = %{a: 1, b: 2, c: [%{d: 3, e: 4}, %{d: 5, e: 6}]}
bar = %{a: 1, b: 2, c: [%{d: 7, e: 8}, %{d: 9, e: 0}]}
...获得以下结果:
%{a: 1, b: 2, c: [%{d: 3, e: 4}, %{d: 5, e: 6}, %{d: 7, e: 8}, %{d: 9, e: 0}]}
简单的Map.merge(foo,bar)
不会这样做,因为c的值是一个列表。
先谢谢您! 克里斯托夫
答案 0 :(得分:3)
使用Map.merge/3
:
Map.merge(foo, bar, fn
_k, v1, v2 when is_list(v1) and is_list(v2) -> v1 ++ v2 # lists
_k, %{} = v1, %{} = v2 -> Map.merge(v1, v2) # maps
_k, v1, v1 -> v1 # equals
_k, v1, v2 -> {v1, v2} # non-equals
end)
#⇒ %{a: 1, b: 2,
# c: [%{d: 3, e: 4}, %{d: 5, e: 6}, %{d: 7, e: 8}, %{d: 9, e: 0}]}
您没有指定规则来合并列表以外的任何内容,但是上面的内容可能很容易扩展以处理任何内容。现在,它可以理解列表,映射,相等值和非相等值。