clojure - 在 Clojure 中按多个键分组

标签 clojure

如何通过多个键对 map 集合进行分组?

例如:

(def m1 [{:a 1 :b 2 :c 3}
         {:a 1 :b 2 :c 4}
         {:a 1 :b 4 :c 3}
         {:a 1 :b 4 :c 3}])

(group-by-x [:a :b] m1)

我想退掉这个:
[{:a 1 :b 2} [{:a 1 :b 2 :c 3}{:a 1 :b 2 :c 4}],
 {:a 1 :b 4} [{:a 1 :b 4 :c 3}{:a 1 :b 4 :c 3}]]

最佳答案

(group-by #(select-keys % [:a :b]) m1)

这将返回一个 map :
{{:b 2, :a 1} [{:a 1, :c 3, :b 2} {:a 1, :c 4, :b 2}],
 {:b 4, :a 1} [{:a 1, :c 3, :b 4} {:a 1, :c 3, :b 4}]}

要准确获取您指定的返回值,请将其包装在 (vec (apply concat ...)) 中。 :
(vec (apply concat (group-by #(select-keys % [:a :b]) m1)))
; => as in the question text

这是等效的,但可能更漂亮:
(->> (group-by #(select-keys % [:a :b]) m1)
     (apply concat)
     vec)

关于clojure - 在 Clojure 中按多个键分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9089200/

相关文章:

xml - 两个xml文件的clojure层次差异

java - 如何使用 swing 和 clojure 制作动画?

clojure - 如何在clojure中创建可执行文件?

java - 即使指定了类路径也缺少 jar 文件

clojure - 如何使用 Clojure 查找序列中元素最后一次出现的位置?

clojure - 奇怪的 super war 行为

clojure - Clojure 中的 i++ 等价物

asynchronous - 为什么 Clojure 的异步库不能处理 Go 素数筛选?

clojure - Clojure 时间和日期库是什么?

clojure - 我可以在 Clojure 中混合后置条件和递归函数吗?