在clojure中将地图列表“展平”为单个地图?

mwa*_*wal 3 clojure

我想从这个由 jdbc 查询返回的地图列表中:

'({:series_id 1 :expires_at "t1"} {:series_id 2 :expires_at "t2"})
Run Code Online (Sandbox Code Playgroud)

到单个地图,如:

{1 "t1" 2 "t2"}
Run Code Online (Sandbox Code Playgroud)

这样我就可以expires_at简单地使用series_id整数来查找了。

我已经到了:

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")
Run Code Online (Sandbox Code Playgroud)

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

我想知道这是否是 reduce 的候选者,和/或是否还有其他一些巧妙的方法可以做到这一点。

Lee*_*Lee 8

您可以将每个映射转换为一对,[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))
Run Code Online (Sandbox Code Playgroud)