(into {} (filter #(-> % val (= 1)) {:a 1 :b 1 :c 2}))
Bien sûr, ce n' reconstruire la carte à partir d'une séquence de la carte des entrées, mais il n'y a pas moyen de contourner cela. Si vous allez pour filtrer les entrées en valeur, vous allez avoir à passer par un par un pour voir les valeurs qui correspondent à vos prédicat et qui ne le sont pas.
Mis à jour (voir les commentaires ci-dessous):
Avec l'introduction du nouveau keep
de la fonction, la source de laquelle vous pouvez voir ici (devrait fonctionner très bien en Clojure 1.1 si vous voulez backport), cela semble être une belle façon d'aller à ce sujet si vous n'utilisez pas nil
clé:
(let [m {:a 1 :b 1 :c 2}]
(apply dissoc m (keep #(-> % val (= 1) (if nil (key %))) m)))
; => {:a 1, :b 1}
Aussi, si vous ne vous en fait voir un ralentissement lié à la reconstruction de votre carte, vous pouvez utiliser un transitoire de la carte lors de l'étape de reconstruction:
(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}