我正在寻找有条件避免在初始化/定义时向地图添加元素的最佳方法.在这种情况下,如果键的值为nil,我想避免向地图添加元素.
(defn create-record [data]
(let [res {
:username (data :username)
:first-name (get-in data [:user-info :name :first])
:last-name (get-in data [:user-info :name :last])
:gender (get-in data [:user-info :sex])
}])
)
Run Code Online (Sandbox Code Playgroud)
如果get-in的结果为nil(数据中的性别字段不存在),我不想在地图上添加性别.有没有办法在我创建地图时这样做?在创建地图后,我可以删除其值为nil的所有键,但在某些情况下,如果它们具有nil值,我希望某些键具有nil值而其他键根本不在地图中.
det*_*erb 21
我会使用merge和when-let这些可选参数的组合.
核心思想是为每个可选参数合并单个元素映射或nil.合并为零将无效,因此您不会在地图中看到零.
(defn create-record [data]
(let [res (merge {:username (data :username)
:first-name (get-in data [:user-info :name :first])
:last-name (get-in data [:user-info :name :last])}
(when-let [gender (get-in data [:user-info :sex])]
{:gender gender}))]
res))
Run Code Online (Sandbox Code Playgroud)
根据您需要执行此操作的频率,我建议围绕when-let编写一个简短的宏或函数,以使代码更简洁.