(into {} (filter #(-> % val (= 1)) {:a 1 :b 1 :c 2}))
Por supuesto, esto hace reconstruir el mapa de una secuencia de entradas del mapa, pero no hay manera de evitarlo. Si vas a filtrar las entradas por valor, vas a tener que ir una por una para ver qué valores coinciden con tu predicado y cuáles no.
actualizado (ver comentarios abajo):
Con la función de reciente introducción keep
, la fuente de la que se puede ver here (debería funcionar bien en Clojure 1.1 si desea backport), esto parece un buen manera de ir sobre él si no se utiliza como una clave nil
:
(let [m {:a 1 :b 1 :c 2}]
(apply dissoc m (keep #(-> % val (= 1) (if nil (key %))) m)))
; => {:a 1, :b 1}
Además, si usted ve realmente una desaceleración relacionada con la reconstrucción de su mapa, puede utilizar un mapa transitoria en la fase de reconstrucción :
(persistent! (loop [m (transient {})
to-go (seq [[:a 1] [:b 2]])]
(if to-go
(recur (apply assoc! m (first to-go))
(next to-go))
m)))
; => {:a 1, :b 2}
Bueno, teóricamente * * usted podría tener que filtrar por valor sin la reconstrucción mediante la devolución de un mapa con las teclas dissoc-ed que corresponden a los valores no coinciden. Tenía la esperanza de que haya una forma de hacerlo compatible con el lenguaje. –
Ok, ya veo lo que quieres decir. Agregaré dos maneras de hacerlo en un segundo, pero tenga en cuenta que no es muy probable que vea una gran ganancia en el departamento de rendimiento (a menos que tenga un mapa realmente grande y solo estará dislocando un pequeño número de llaves). –
Hm, en realidad no es tanto "dos formas de hacerlo" como "una forma de hacerlo y una forma de preocuparse menos por la reconstrucción". No es muy probable que deba preocuparse. :-) –