首页 > 解决方案 > 合并可能不存在的嵌套地图的正确方法

问题描述

给定两个可能的输入: a = %{ inner: %{hello: :world}}

或者 a = %{}

我想合并b = %{foo: :bar}到地图中以产生:

%{inner: %{foo: :bar}}在第一种情况下或

%{inner: %{hello: :world, foo: :bar}}在第二。

我可以解决它

merged = Map.get(a, :inner, %{})
|> Map.merge(b)
put_in(a, [:inner], merged)

但是有更好的内置方式吗?我认为深度合并应该比这更容易。

标签: elixir

解决方案


我认为您正在寻找Map.merge/3功能。第三个参数是一个函数,它解决了冲突:

a = %{inner: %{hello: :world}}
b = %{foo: :bar}
Map.merge(a, %{inner: b}, fn _, m1, m2 -> Map.merge(m1, m2) end)

因此,在这种情况下,当发生冲突时(正在合并的两个映射具有相同的键),将调用提供的函数。当ais时%{},不会发生冲突并%{inner: %{foo: :bar}}返回。


推荐阅读