2016-04-26 15 views
1

は、DBがマップのベクターを含む原子でマップのベクトル内のマップの値をClojureScriptで更新するにはどうすればよいですか?

(def db (atom [ 
{:id 1 :data {:name "Foo"} :par nil} 
{:id 2 :data {:name "Bar"} :par nil}])) 

次の仮定のコードを考えます。

さて、私は例えば、マップのいずれかで、キーの値を更新機能を作りたい:

(defn update [id value] 
-- update 
-- in db atom as defined above 
-- where :id is equal to id 
-- set :par to value 
) 

はどのようにこれを行うことができますか?ここで

答えて

1

機能です:

(defn update-par [id value] 
    ;; update 
    ;; in db atom as defined above 
    ;; where :id is equal to id 
    ;; set :par to value 
    (swap! db (fn [v] (mapv (fn [item] (if (= (:id item) id) (assoc item :par value) item)) v))) 
) 

そして、それを呼び出す:

(defn example [] 
    (update-par 1 "new value")) 

=> (example) 
[{:id 1, :data {:name "Foo"}, :par "new value"} {:id 2, :data {:name "Bar"}, :par nil}] 
関連する問題