elixir - 合并可能不存在的嵌套地图的正确方法
问题描述
给定两个可能的输入:
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)
但是有更好的内置方式吗?我认为深度合并应该比这更容易。
解决方案
我认为您正在寻找Map.merge/3功能。第三个参数是一个函数,它解决了冲突:
a = %{inner: %{hello: :world}}
b = %{foo: :bar}
Map.merge(a, %{inner: b}, fn _, m1, m2 -> Map.merge(m1, m2) end)
因此,在这种情况下,当发生冲突时(正在合并的两个映射具有相同的键),将调用提供的函数。当a
is时%{}
,不会发生冲突并%{inner: %{foo: :bar}}
返回。
推荐阅读
- tableau-desktop - 为什么在向仪表板添加筛选器时收到 Tableau 错误 6EA18A9E
- python - 如何将 db 获取的数据与 django 中用户选择的输入进行比较
- c# - asp net core发生错误时如何记录请求url?
- css - Tailwind 每次编译时都会生成错误的类
- android - 尝试在 Android 上运行我的 React Native 应用程序时出错
- autocomplete - 自动完成材料-ui 默认/首选项搜索
- java - 尝试使用 OracleDataSource 在 19c DB 中获取连接时出错
- vue.js - Vue 路由器(历史模式)和 Webpack 外部重定向处理
- sockets - 使用静态端口配置从 tcp 中的一个客户端套接字连接两个服务器套接字
- javascript - 是否可以在 TypeScript 中创建严格的“A 或 B”类型?