在Clojure中有条件地初始化地图元素

Geo*_*way 25 clojure

我正在寻找有条件避免在初始化/定义时向地图添加元素的最佳方法.在这种情况下,如果键的值为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

我会使用mergewhen-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编写一个简短的宏或函数,以使代码更简洁.