我想从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])))
这比李的回答更详细,但我希望它也能帮助读者学习语言!