2014-09-26 58 views
2

如何將地圖中的每個值應用於地圖中的每個值。Clojure:對地圖中的每個地圖中的每個值應用函數

如果我有地圖

(def vector-of-maps [{:a 1 :b 2} {:a 3 :b 4}]) 

的載體而想要在每一個地圖上的每個值應用的功能,因此我要地圖的同一載體,像這樣

(map #(+ 1 %) vector-of-maps) 

這樣的結果是

[{:a 2 :b 3} {:a 4 :b 5}] 

而且我希望它與地圖中的任何載體,而不只是這個特殊的....

回答

4
=> (defn update-map [m f] (reduce-kv (fn [m k v] (assoc m k (f v))) {} m)) 
=> (map #(update-map % inc) vector-of-maps) 
({:b 3, :a 2} {:b 5, :a 4}) 
+1

可以用'減少,kv'這裏 – edbond 2014-09-26 18:07:32

+0

@edbond THX,編輯使用減少千伏 – user100464 2014-09-26 18:22:38

+0

@ user100464鍵的順序是相反的,有沒有辦法改變這種情況? – Vesna 2014-09-27 07:09:48

1

也許

(defn mapv-map-values [f vm] 
    (letfn [(map-values [m] (zipmap (keys m) (map f (vals m))))] 
    (mapv map-values vm))) 

...生產

(mapv-map-values inc [{:a 1 :b 2} {:a 3 :b 4}]) 
;[{:b 3, :a 2} {:b 5, :a 4}] 

map-values功能,從@user100464's answer唯一顯著出發,改編自here

1

,你也可以像這樣,但它是醜陋

(defn dodo [m] (map (fn [map] (apply merge (for [[k v] map] (assoc {} k (inc v))))) m)) 

(dodo [{:a 1 :b 2} {:a 3 :b 4}]) 
;({:a 2, :b 3} {:a 4, :b 5}) 
相關問題