conj map filter clojure

conj - ¿Filtrar valores nulos del mapa de Clojure?



reduce in clojure (5)

Probablemente no sea la mejor solución, pero aquí hay una que usa la lista de comprensión:

(into {} (for [[k v] {:a 1 :b nil :c :z} :when (not (nil? v))] [k v]))

¿Cuál es la mejor manera de filtrar valores nil desde un mapa Clojure {} ?

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


(into {} (keep (fn [e] (if (val e) e)) {:a :x :b nil :c :z})) ;;=> {:a :x, :c :z}

o un poco más corto:

(into {} (keep #(if (val %) %) {:a :x :b nil :c :z}))

De hecho, su sugerencia de filtro es mucho mejor y más corta, así que simplemente usaría eso:

(into {} (filter val {:a :x :b nil :c :z}))


Yo uso el siguiente código:

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

NOTA: esto eliminará los valores falsos así como los nulos


La mejor forma de hacerlo es en realidad (into {} (keep second {:a :x :b nil}))


Yo usaría:

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

Haciendo el algunos? comprobar explícitamente es importante porque si lo hace (into {} (filter val {...})) , se eliminarán erróneamente valores que son booleanos falsos.