(into {} (filter #(-> % val (= 1)) {:a 1 :b 1 :c 2}))
Конечно, это делает восстановить карту из последовательности записей карт, но нет никакого способа вокруг него. Если вы собираетесь фильтровать записи по значению, вам придется проходить через них один за другим, чтобы увидеть, какие значения соответствуют вашему предикату, а какие нет.
обновился (см комментарии ниже):
С недавно введенной keep
функции, источник которого вы можете увидеть here (должен работать только штрафом в Clojure 1.1, если вы хотите портировать), это, кажется, как хороший способ пойти об этом , если вы не используете nil
в качестве ключевого:
(let [m {:a 1 :b 1 :c 2}]
(apply dissoc m (keep #(-> % val (= 1) (if nil (key %))) m)))
; => {:a 1, :b 1}
Кроме того, если вы на самом деле увидеть замедление, связанное с восстановления вашей карты, вы можете использовать переходную карту на этапе перестройки :
(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}
Ну, * теоретически * вы можете иметь его фильтруется стоимости без восстановления, возвращая карту с помощью клавиш dissoc-е изд, которые соответствуют значениям несовпадающих. Я надеялся, что есть способ, поддерживаемый языками. –
Хорошо, я понимаю, что вы имеете в виду. Я добавлю два способа сделать это за секунду, но обратите внимание, что вы вряд ли увидите большой выигрыш в отделе производительности (если у вас нет действительно огромной карты, и вы будете только разобрать небольшую количество ключей). –
Хм, на самом деле это не так много «двух способов сделать это» как «один из способов сделать это и один способ меньше беспокоиться о перестройке». Не то чтобы вам очень нужно было волноваться. :-) –