Elixir中合并可能不存在的嵌套Map,是否有更优内置方法?
Elixir 中更简洁的嵌套 Map 合并方案
好问题!在 Elixir 标准库中,确实没有直接提供通用的深度 Map 合并内置函数,但针对你这种特定的单层嵌套合并场景,我们可以用现有工具写出更紧凑的实现,比你当前的写法更简洁。
优化后的内置方案:用 update_in 简化操作
你当前的写法已经能解决问题,但可以用 update_in/3 把逻辑压缩到一行——它专门用来更新嵌套结构的指定路径值,完美适配你的需求:
update_in(a, [:inner], &Map.merge(&1 || %{}, b))
逻辑解释:
update_in(a, [:inner], fun)会先获取a中[:inner]路径的值(如果不存在则返回nil)&1 || %{}处理了a中没有:inner字段的情况,把nil转为空 Map- 最后用
Map.merge/2把b合并到目标 Map 中,自动覆盖或新增键
验证两种场景:
当
a = %{}时:a = %{} b = %{foo: :bar} update_in(a, [:inner], &Map.merge(&1 || %{}, b)) # 结果:%{inner: %{foo: :bar}}当
a = %{inner: %{hello: :world}}时:a = %{inner: %{hello: :world}} b = %{foo: :bar} update_in(a, [:inner], &Map.merge(&1 || %{}, b)) # 结果:%{inner: %{hello: :world, foo: :bar}}
关于通用深度合并
如果你的需求是多层嵌套的深度合并(比如 a = %{x: %{y: 1}},b = %{x: %{z: 2}},要得到 %{x: %{y:1, z:2}}),标准库没有内置函数,这时候可以使用社区维护的第三方包,但这不属于内置方案范畴。
内容的提问来源于stack exchange,提问作者intentionally-left-nil
相关产品推荐
相关产品推荐

