2013-02-26 18 views
5

W przypadku list i wektorów możemy podzielić sekwencję i wziąć dowolną porcję. Jak wykonać podobne operacje na obiektach map?jaki jest idiomatyczny sposób wycinania mapy w Clojure?

Na przykład, mam listę mapy obiektu,

(def plays [ 
     {:name "Burial",  :plays 979, :loved 9} 
     {:name "Eno",  :plays 2333, :loved 15} 
     {:name "Bill",  :plays 979, :loved 9} 
     {:name "Magma",  :plays 2665, :loved 31}]) 

Na każdej mapie, chcę odciąć kolumnę odtworzeń i dodać kolumnę stopy o wartości domyślnej, co jest idiomatycznych sposobem, aby to zrobić ?

Odpowiedz

17

assoc i dissoc są twoi przyjaciele w tym przypadku:

(map #(-> % (dissoc :plays) 
      (assoc :rate 10)) plays) 
+0

Terse i do punkt. Prosty. Piękny. – omiel

13

zależności od przypadków użycia, użytkownik może również znaleźć select-keys użyteczne oprócz assoc i dissoc:

clojure.core/select-keys 
([map keyseq]) 
    Returns a map containing only those entries in map whose key is in keys 
(select-keys {:name "Eno" :plays 2333 :loved 15} [:name :loved]) 
;; => {:name "Eno" :loved 15} 
Powiązane problemy