2012-03-15 19 views
26

que tienen una función que elimina una clave de un mapa:¿Cómo eliminar varias claves de un mapa?

(defn remove-key [key map] 
    (into {} 
     (remove (fn [[k v]] (#{key} k)) 
       map))) 

(remove-key :foo {:foo 1 :bar 2 :baz 3}) 

¿Cómo aplico esta función utilizando varias claves?

(remove-keys [:foo :bar] {:foo 1 :bar 2 :baz 3}) 

Tengo una implementación usando el lazo ... recur. ¿Hay alguna forma más idiomática de hacer esto en Clojure?

(defn remove-keys [keys map] 
    (loop [keys keys 
     map map] 
    (if (empty? keys) 
     map 
     (recur (rest keys) (remove-key (first keys) map))))) 

Respuesta

44

Su función remove-key está cubierto por la librería estándar función dissoc. dissoc eliminará más de una clave a la vez, pero quiere que las claves se den directamente en la lista de argumentos en lugar de en una lista. Entonces puede usar apply para "aplanarlo".

(apply dissoc {:foo 1, :bar 2, :baz 3} [:foo :bar]) 
==> {:baz 3} 
40

dissoc elimina una o más claves de un mapa:

(dissoc {:foo 1 :bar 2 :baz 3} :foo :bar) 

o, si tiene las claves de una colección

(apply dissoc {:foo 1 :bar 2 :baz 3} [:foo :bar]) 
+0

¿Clojure no tiene forma de "explotar" un vector en una llamada a función? ¿'' list "de ala Python? – john2x

+5

@ john2x, 'apply' hace exactamente eso. Es decir, '(aplicar f foo bar baz)' es equivalente a 'f (foo bar * baz)' en python. –

11

Como otros dijeron usar la función incorporada en lugar de escribir la suya.

Sin embargo, si esto era sólo un ejemplo y se desea una respuesta de cómo hacer que si no había un dissoc estándar, entonces usted puede utilizar:

(reduce (fn [m k] (remove-key k m)) {:foo 1 :bar 2 :baz 3} [:foo :bar]) 

Obviamente, si vuelve los argumentos para eliminar tecla se puede escribir mucho más simple:

(reduce remove-key {:foo 1 :bar 2 :baz 3} [:foo :bar]) 
1

me encontré con este tipo de cosas y otros para ser súper molesto en clojure, por lo que para solucionarlo creé el estadio de biblioteca: https://github.com/boxed/instar.

Cuestiones relacionadas