2013-02-26 4 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

13

あなたのユースケースに応じて、あなたもassocdissocに加えて、有益なselect-keysを見つけるかもしれない:

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} 
関連する問題