(into {} (filter #(-> % val (= 1)) {:a 1 :b 1 :c 2}))
Oczywiście to robi odbudować mapę z sekwencji wpisów map, ale nie ma sposobu, wokół niego. Jeśli chcesz filtrować wpisy według wartości, będziesz musiał je kolejno przeglądać, aby sprawdzić, które wartości pasują do Twojego predykatu, a które nie.
aktualizowane (patrz komentarz poniżej):
z nowo wprowadzonej keep
funkcji, źródło, które można zobaczyć here (powinien działać dobrze w Clojure 1.1 jeśli chcesz backport), to wydaje się ładny sposób się do tego zabrać jeśli nie używasz nil
jako kluczowy:
(let [m {:a 1 :b 1 :c 2}]
(apply dissoc m (keep #(-> % val (= 1) (if nil (key %))) m)))
; => {:a 1, :b 1}
Ponadto, jeśli faktycznie zobaczyć spowolnienie związane z przebudowa swoją mapę, można użyć na etapie przebudowy przemijające mapę :
(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}
Cóż, teoretycznie * * można mieć ono filtrowane przez wartość bez odbudowy wracając mapę z kluczami dissoc-owych, które odpowiadają wartościom niedopasowanych. Miałem nadzieję, że jest to obsługiwany język. –
Ok, rozumiem co masz na myśli. Dodam dwa sposoby, aby to zrobić w ciągu sekundy, ale zauważ, że prawdopodobnie nie dostrzeżesz wielkiego zysku w dziale wydajności (chyba że masz naprawdę ogromną mapę i rozproszysz tylko małą liczba kluczy). –
Hm, w rzeczywistości to nie tyle "dwa sposoby na zrobienie tego", co "jeden sposób na zrobienie tego i jeden sposób na mniej obaw o odbudowę". Nie żebyś musiał się martwić. :-) –