接下来我的问题是,我有地图列表,例如:
({: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;?
答案 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;中所述。