合并Elixir地图

时间:2019-04-24 09:36:52

标签: maps elixir

如何合并这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的值是一个列表。

先谢谢您! 克里斯托夫

1 个答案:

答案 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}]}

您没有指定规则来合并列表以外的任何内容,但是上面的内容可能很容易扩展以处理任何内容。现在,它可以理解列表,映射,相等值和非相等值。