Я ищу лучший способ условно избежать добавления элемента на карту, когда он инициализируется / определяется . В этом случае я хочу избежать добавления элемента на карту, если значение ключа равно нулю.
(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])
}])
)
Я не хочу добавлять пол на карту, если результаты присоединения нулевые (поле пола в данных не существует). Есть ли способ сделать это при создании карты? Я мог бы удалить все ключи, значение которых равно нулю, после создания карты, но в некоторых случаях я хочу, чтобы некоторые ключи имели нулевые значения, а другие вообще не присутствовали на карте, если бы они имели нулевые значения.
Вы можете сделать что-то вроде
(let [not-nils #{:gender}]
(defn create-record [data]
(into {} (for [[k v] {: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])}
:when (not (and (nil? v) (not-nils k)))]
[k v]))))
(defn create-record [data]
(let [gender (get-in data [:user-info :sex])]
(->> {:username (data :username)
:first-name (get-in data [:user-info :name :first])
:last-name (get-in data [:user-info :name :last])}
(#(if gender (assoc % :gender gender) %)))))
Вот попытка:
(defn exclude-nils-for [m kw-set]
(apply hash-map (apply concat (remove (fn [[k v]] (and (kw-set k) (nil? v))) m))))
Тест:
user> (exclude-nils-for {:gender "m" :name "Thomas" :age "24"} #{})
{:age "21", :gender "m", :name "Thomas"}
user> (exclude-nils-for {:gender "m" :name "Thomas" :age "24"} #{:name})
{:age "21", :gender "m", :name "Thomas"}
user> (exclude-nils-for {:gender "m" :name nil :age "24"} #{:name})
{:age "21", :gender "m"}
user> (exclude-nils-for {:gender "m" :name nil :age nil} #{:age})
{:gender "m", :name nil}