我会做什么,是重新考虑生成的数据结构:我不知道您将如何使用生成的集合,但命名键:sizeonX
,特别是当注册日期的数量可能可变或者其中一些可能丢失时(例如,如果您有日期1
和3
第一个路径,而1
2
3
5
第二个路径)会导致结果映射中出现一堆不可预测的命名键,这会使检索这些键变得更加困难。在我看来,使用这种结构会更好:
{:path "first" :sizes {"1" "500" "2" "1g" "10" "222"}}
所以这个尺寸图很容易迭代和处理。
这就是我将如何做到的:
(def data '({:path "first" :size "1 gb" :date "1"}
{:path "first" :size "0.9 gb" :date "3"}
{:path "second" :size "500 mb" :date "1"}
{:path "second" :size "700 mb" :date "2"}
{:path "second" :size "400 mb" :date "3"}
{:path "second" :size "900 mb" :date "5"}))
(map (fn [[k v]] {:path k
:sizes (into {} (map (juxt :date :size) v))})
(group-by :path data))
;; ({:path "first", :sizes {"1" "1 gb", "3" "0.9 gb"}}
;; {:path "second", :sizes {"1" "500 mb",
;; "2" "700 mb",
;; "3" "400 mb",
;; "5" "900 mb"}})
更新
但由于您仍然需要问题的结构,我会这样做:
(map (fn [[k v]]
(into {:path k}
(map #(vector (keyword (str "sizeon" (:date %)))
(:size %))
v)))
(group-by :path data))
;;({:path "first", :sizeon1 "1 gb", :sizeon3 "0.9 gb"}
;; {:path "second",
;; :sizeon1 "500 mb", :sizeon2 "700 mb",
;; :sizeon3 "400 mb", :sizeon5 "900 mb"})
这基本上类似于@superkonduktr 变体。