在Clojure中按多个键分组

Ron*_*n P 14 clojure

如何通过多个键对一组地图进行分组?

例如:

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

我想退掉这个:

[{: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}]]
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 22

(group-by #(select-keys % [:a :b]) m1)
Run Code Online (Sandbox Code Playgroud)

这会返回一张地图:

{{: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}]}
Run Code Online (Sandbox Code Playgroud)

要准确获取您指定的返回值,请将其包装在(vec (apply concat ...)):

(vec (apply concat (group-by #(select-keys % [:a :b]) m1)))
; => as in the question text
Run Code Online (Sandbox Code Playgroud)

这是等价的,但可能更漂亮:

(->> (group-by #(select-keys % [:a :b]) m1)
     (apply concat)
     vec)
Run Code Online (Sandbox Code Playgroud)

  • 你也可以`(group-by(juxt:a:b)coll)`,它给你成对而不是地图作为键.通常这将是一个比使用`:a`和`:b`键的数十个映射更有用的格式,但这完全取决于您的应用程序. (9认同)