2012-12-20 60 views
4

我有地圖的列表:計算的值,並將其添加到地圖

(def mylist 
    [{:id 1 :sub [{:subid 1} {:subid 2}]} 
    {:id 2 :sub [{:subid 3}]}]) 

我想一個新的鍵/值對添加到包含的項目在數量列表中的每個地圖元素:sub

[{:id 1 :sub [{:subid 1} {:subid 2}] :subcount 2} 
{:id 2 :sub [{:subid 3}] :subcount 1}] 

我怎樣才能做到這一點?

+1

您的括號是否在這裏?看起來像你打算:子計數鍵出現在頂層地圖中,而不是在與子鍵關聯的向量內。 – Alex

+0

你說得對。修復。 – tobiasbayer

回答

7

在clojure中,「添加到地圖」是通過assoc完成的,它會返回一個添加了指定值的新地圖,並且通常如果您想對某個集合執行相同的操作,則可以使用map函數。

(defn subcount 
    "return the number of items in the :sub of m" 
    [m] 
    (count (:sub m))) 

(defn add-count 
    "add subcount to the given map" 
    [m] 
    (assoc m :subcount (subcount m))) 

(defn add-counts 
    "add subcount to all the objects" 
    [objects] 
    (map add-count objects)) 

(def mylist 
    [{:id 1 :sub [{:subid 1} {:subid 2}]} 
    {:id 2 :sub [{:subid 3}]}]) 

(add-counts mylist) 
=> ({:sub [{:subid 1} {:subid 2}], :subcount 2, :id 1} {:sub [{:subid 3}], :subcount 1, :id 2}) 
+0

非常全面的解釋。謝謝! – tobiasbayer

相關問題