Условная инициализация элементов карты в Clojure

Я ищу лучший способ условно избежать добавления элемента на карту, когда он инициализируется / определяется . В этом случае я хочу избежать добавления элемента на карту, если значение ключа равно нулю.

(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])
   }])
)

Я не хочу добавлять пол на карту, если результаты присоединения нулевые (поле пола в данных не существует). Есть ли способ сделать это при создании карты? Я мог бы удалить все ключи, значение которых равно нулю, после создания карты, но в некоторых случаях я хочу, чтобы некоторые ключи имели нулевые значения, а другие вообще не присутствовали на карте, если бы они имели нулевые значения.

25
задан Geoffrey Gallaway 24 January 2012 в 19:40
поделиться

3 ответа

Вы можете сделать что-то вроде

(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]))))
1
ответ дан 28 November 2019 в 21:48
поделиться
(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) %)))))
1
ответ дан 28 November 2019 в 21:48
поделиться

Вот попытка:

(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}
0
ответ дан 28 November 2019 в 21:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: