Отфильтровать значения nil от карты Clojure?
Каков наилучший способ фильтрации значений nil
из карты Clojure {}
?
{ :a :x :b nil :c :z }
;;=> { :a :x, :c :z }
Ответы
Ответ 1
Я бы использовал:
(into {} (filter (comp some? val) {:a :x, :b nil, :c :z}))
=> {:a :x, :c :z}
Выполнение some? check явно важно, потому что, если вы просто выполняете (into {} (filter val {...}))
, вы ошибочно удаляете значения, которые являются логическими false.
Ответ 2
Я использую следующий код:
(into {} (filter val {:a 1, :b 2, :c nil}))
;;=> {:a 1, :b 2}
ПРИМЕЧАНИЕ: это приведет к удалению ложных значений, а также nils
Ответ 3
Вероятно, это не лучшее решение, но здесь, которое использует понимание списка:
(into {}
(for [[k v] {:a 1 :b nil :c :z} :when (not (nil? v))]
[k v]))
Ответ 4
(into {} (keep (fn [e] (if (val e) e)) {:a :x :b nil :c :z}))
;;=> {:a :x, :c :z}
или немного короче:
(into {} (keep #(if (val %) %) {:a :x :b nil :c :z}))
На самом деле, ваше предложение фильтра намного лучше и короче, поэтому я бы просто использовал это:
(into {} (filter val {:a :x :b nil :c :z}))
Ответ 5
Самый приятный способ сделать это на самом деле (into {} (keep second {:a :x :b nil}))