Clojure 将映射向量转换为向量值映射

标签 clojure

有一些与此主题相关的帖子,但是我找不到任何适合我想要完成的任务。

我有一个 map 矢量。我将使用另一个相关 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"}]))

我想将其转换为一个映射,其中每个条目的值是关联值的向量(保持数据的顺序)。

这是我想要的输出:

{: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"]}

在 Clojure 中是否有一种优雅且有效的方法来做到这一点?

最佳答案

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

(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"]}

另一个接近的:

(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"]]}

关于Clojure 将映射向量转换为向量值映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54367465/

相关文章:

clojure - 使用 Clojure 进行 Overhand Shuffle - 几乎

clojure - 是否可以将 Clojure 的案例形式与 Java 枚举一起使用?

java - 正则表达式:匹配所有连字符,并用空格替换仅包含字母且不在引号内的单词

java - 在 Clojure 中捕获系统/输出

clojure - 热修复 "WARNING: any? already refers to: #' clojure.core/any?在命名空间 : leiningen. midje 中,被替换为:#'leiningen.midje/any?"

java - 在 Clojure 中导入 Lucene jar

clojure - Leiningen和Clojure CLI工具之间有什么区别,我应该如何使用它们?

java - 没有 Maven 的 Vaadin Clojure 小部件编译

java - 如何在 defprotocol 中使用可选参数?

performance - 为什么这个 Clojure 微基准测试这么慢?