我想减少以下序列:
({0 "Billie Verpooten"}
{1 "10:00"}
{2 "17:00"}
{11 "11:10"}
{12 "19:20"})
到
{:name "Billie Verpooten"
:work {:1 ["10:00" "17:00"]
:11 ["11:10" "19:20"]}}
但我不知道这样做。
我正在考虑使用解构的递归函数。
标准库中有一个函数可以将序列简化为某种东西,它被称为reduce
. 尽管在您的特定情况下,似乎首先适合remove
特殊情况键0
,然后partition
将其余键放入它们应成为的条目对中。
以下函数给出了您的问题中描述的结果:
(defn build-map [maps]
(let [entries (map first maps)
key-zero? (comp zero? key)]
{:name (val (first (filter key-zero? entries)))
:work (reduce (fn [acc [[k1 v1] [k2 v2]]]
(assoc acc (keyword (str k1)) [v1 v2]))
{}
(partition 2 (remove key-zero? entries)))}))
只是为了多样化,这里是通过线程序列操作函数表达答案的不同方式:
user> (def data '({0 "Billie Verpooten"}
{1 "10:00"}
{2 "17:00"}
{11 "11:10"}
{12 "19:20"}))
user> {:name (-> data first first val)
:work (as-> data x
(rest x)
(into {} x)
(zipmap (map first (partition 1 2 (keys x)))
(partition 2 (vals x))))}
线程宏是Clojure as->
1.5 的新功能,使表达这种函数更加简洁。