在clojure中使用reduce分组

h3x*_*x3d 4 reduce group-by clojure

我想聚合大型数据集以获得类似的东西

SELECT SUM(`profit`) as `profit`, `month` FROM `t` GROUP BY `month`
Run Code Online (Sandbox Code Playgroud)

所以,我像这样修改了clojure的分组功能

(defn group-reduce [f red coll]
  (persistent!
   (reduce
    (fn [ret x]
      (let [k (f x)]
        (assoc! ret k (red (get ret k) x))))
    (transient {}) coll)))
Run Code Online (Sandbox Code Playgroud)

这是用法:

(group-reduce :month (fn [s x]
                       (if s
                         (assoc s :profit (+ (:profit s) (:profit x)))
                         x))
              [{:month 10 :profit 12}
               {:month 10 :profit 15}
               {:month 12 :profit 1}])

#_=> {10 {:profit 27, :month 10}, 12 {:profit 1, :month 12}}
Run Code Online (Sandbox Code Playgroud)

它有效,但也许有另一种方法可以做到这一点,使用 clojure 标准库?

A. *_*ebb 5

最接近核心的是merge-with

(def t [{:month 10 :profit 12}
        {:month 10 :profit 15}
        {:month 12 :profit 1}])

(apply merge-with + (for [x t] {(:month x) (:profit x)}))
;=> {12 1, 10 27}
Run Code Online (Sandbox Code Playgroud)