计算值并将其添加到地图中

时间:2012-12-20 08:01:28

标签: clojure

我有一张地图列表:

(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 个答案:

答案 0 :(得分: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})