Отфильтровать нулевые значения из карты Clojure? - PullRequest
15 голосов
/ 18 февраля 2012

Каков наилучший способ фильтрации nil значений из карты Clojure {}?

{ :a :x :b nil :c :z }
;;=>  { :a :x, :c :z }

Ответы [ 5 ]

36 голосов
/ 18 февраля 2012

Я бы использовал:

(into {} (filter (comp some? val) {:a :x, :b nil, :c :z}))

=> {:a :x, :c :z}

Выполнение проверки some? явно важно, потому что если вы просто сделаете (into {} (filter val {...})), то вы ошибочно удалите значения, которые являются логическими ложными.1007 *

5 голосов
/ 18 февраля 2012

Я использую следующий код:

(into {} (filter val {:a 1, :b 2, :c nil}))
;;=> {:a 1, :b 2}

ПРИМЕЧАНИЕ: это удалит ложные значения, а также nils

3 голосов
/ 18 февраля 2012

Возможно, не лучшее решение, но вот то, которое использует понимание списка:

(into {} 
  (for [[k v] {:a 1 :b nil :c :z} :when (not (nil? v))]
    [k v]))
0 голосов
/ 28 июня 2012

Самый хороший способ сделать это на самом деле (into {} (keep second {:a :x :b nil}))

0 голосов
/ 18 февраля 2012
(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}))
...