2013-02-26 16 views
5

Per elenchi e vettori, possiamo suddividere la sequenza e prendere qualsiasi porzione che vogliamo. Come eseguire operazioni simili per mappare gli oggetti?qual è il modo idiomatico per tagliare una mappa in Clojure?

Per esempio, ho una lista di carta oggetto,

(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}]) 

per ogni mappa, voglio tagliare via colonna di opere teatrali, e aggiungere colonna di tasso con il valore di default, qual è il modo idiomatico per farlo ?

risposta

17

assoc e dissoc sono i tuoi amici in questo caso:

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

Terse e per il punto. Semplice. Bellissimo. – omiel

13

A seconda del caso d'uso, si potrebbe anche trovare select-keys utile oltre a assoc e 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} 
Problemi correlati