Clojure将地图矢量转换为矢量值的地图

fra*_*ank 1 clojure

有一些与此主题相关的SO帖子,但是我找不到任何适用于我想要实现的内容.

我有一张地图矢量.我将使用来自另一个相关SO帖子的示例:

(def data
   [{:id 1 :first-name "John1" :last-name "Dow1" :age "14"}
    {:id 2 :first-name "John2" :last-name "Dow2" :age "54"}
    {:id 3 :first-name "John3" :last-name "Dow3" :age "34"}
    {:id 4 :first-name "John4" :last-name "Dow4" :age "12"}
    {:id 5 :first-name "John5" :last-name "Dow5" :age "24"}]))
Run Code Online (Sandbox Code Playgroud)

我想将其转换为一个映射,每个条目的值是相关值的向量(保持顺序data).

这是我想要的输出:

{:id [1 2 3 4 5]
 :first-name ["John1" "John2" "John3" "John4" "John5"]
 :last-name ["Dow1" "Dow2" "Dow3" "Dow4" "Dow5"]
 :age ["14" "54" "34" "12" "24"]}
Run Code Online (Sandbox Code Playgroud)

在Clojure中有一种优雅而有效的方法吗?

Mic*_*ent 5

可以提高效率,但这是一个很好的开始:

(def ks (keys (first data)))
(zipmap ks (apply map vector (map (apply juxt ks) data))) ;;=> 

{:id [1 2 3 4 5]
 :first-name ["John1" "John2" "John3" "John4" "John5"]
 :last-name ["Dow1" "Dow2" "Dow3" "Dow4" "Dow5"]
 :age ["14" "54" "34" "12" "24"]}
Run Code Online (Sandbox Code Playgroud)

另一个接近:

(group-by key (into [] cat data))

;;=> 
{:id [[:id 1] [:id 2] [:id 3] [:id 4] [:id 5]],
 :first-name [[:first-name "John1"] [:first-name "John2"] [:first-name "John3"] [:first-name "John4"] [:first-name "John5"]],
 :last-name [[:last-name "Dow1"] [:last-name "Dow2"] [:last-name "Dow3"] [:last-name "Dow4"] [:last-name "Dow5"]],
 :age [[:age "14"] [:age "54"] [:age "34"] [:age "12"] [:age "24"]]}
Run Code Online (Sandbox Code Playgroud)