2013-02-26 210 views
5

对于列表和向量,我们可以切片序列,并采取我们想要的任何部分。 如何做类似的操作来映射对象?在Clojure中切片地图的习惯用法是什么?

例如,我有地图对象的列表,

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

对于每一个地图,我想切掉剧列,并用默认值添加率列,什么是做到这一点的惯用方式?

回答

17

assocdissoc是你的朋友在这种情况下:

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

Terse and to重点。简单。美丽。 – omiel 2013-12-03 15:49:30

13

根据您的使用情况,您可能还会发现select-keys有用的除了assocdissoc

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} 
相关问题