地图列表中的地图

时间:2017-11-02 18:53:00

标签: clojure

接下来我的问题是,我有地图列表,例如:

({:id 1 :request-count 10 ..<another key-value pair>..} 
 {:id 2 :request-count 15 ..<another key-value pair>..} 
 ...)

需要创建包含记录的地图,其中键是&#39; id&#39;对于来自prev示例的每个地图,值和值是&#39; request-count&#39;,如:

{1 10
 2 15
 ...}

我知道怎么做。我的问题是 - 标准库有实现这个功能吗?或者也许我可以通过组合很少的功能实现这一点,而不会减少&#39;?

2 个答案:

答案 0 :(得分:8)

使用juxt函数生成一系列对,然后将它们放入地图中:

(into {} (map (juxt :id :request-count) data))

示例:

user=> (def data [{:id 1 :request-count 10 :abc 1}
  #_=>            {:id 2 :request-count 15 :def 2}
  #_=>            {:id 3 :request-count 20 :ghi 3}])
#'user/data
user=> (into {} (map (juxt :id :request-count) data))
{1 10, 2 15, 3 20}

请注意,如果data中有多个地图具有相同的:id,则map遇到的最后一个地图将是输出地图中存在的地图。

答案 1 :(得分:1)

我会这样做:

(def data
  [{:id 1 :request-count 10}
   {:id 2 :request-count 15}]  )

(defn make-id-req-map [map-seq]
  (vec (for [curr-map map-seq]
         (let [{:keys [id request-count]} curr-map]
           {id request-count}))))

结果:

(make-id-req-map data) => [{1 10} {2 15}]

注意:虽然您可以将地图解构组合到for语句中,但我通常喜欢标记中间值,如Martin Fowler的重构&#34;介绍解释变量&#34;中所述。