"flatten"将地图列表到Clojure中的单个地图?



我想从jdbc查询返回的映射列表开始:

'({:series_id 1 :expires_at "t1"} {:series_id 2 :expires_at "t2"})

到一个单一的地图,如:

{1 "t1" 2 "t2"}

所以我可以简单地使用series_id整数来查找expires_at

我已经达到:

db.core=> (mapcat #((comp vals select-keys) %1 [:series_id :expires_at]) 
'({:series_id 1, :expires_at "t1"} {:series_id 2 :expires_at "t2"}))
(1 "t1" 2 "t2")

但那是一份清单,而不是地图。

我想知道这是否是reduce的候选者,和/或是否有其他巧妙的方法。

您可以将每个映射转换为一对[series_id expires_at],然后将对应的对序列转换为映射:

(def l '({:series_id 1 :expires_at "t1"} {:series_id 2 :expires_at "t2"}))
(into {} (map (juxt :series_id :expires_at) l))

或者,使用列表理解和销毁

(defn flatten-expiration-data [the-maps]
(into {}
(for [{id :series_id expiration :expires_at} the-maps]
[id expiration])))

这比李的回答更详细,但我希望它也能帮助读者学习语言!

最新更新