Clojure中的动态分组

tri*_*lem 1 clojure

我在 Clojure 中有以下数据结构:

(def test-data [{:year 2023
                 :quarter 1
                 :month 1
                 :week 1
                 :date (jt/local-date 2023 1 2)
                 :name "Name1"
                 :value 5}
                {:year 2023
                 :quarter 1
                 :month 1
                 :week 1
                 :date (jt/local-date 2023 1 2)
                 :name "Name2"
                 :value 3}])
Run Code Online (Sandbox Code Playgroud)

现在我想按不同的关键字动态地对该数据集进行分组(例如:按年、周和名称或按年、月和名称或仅按名称)。

我尝试使用一些结构来实现这一点,例如:

(defn group-year-week-name [group-keys rows]
  (let [group-keys-set (set group-keys)]
  (map (fn [[grp-key values]] {(keyword (first grp-key)) (first grp-key)
                                ...
                                :value-sums (reduce (+ :value values))
                                :values values
                                })
    (group-by (juxt :week :year) rows))))
Run Code Online (Sandbox Code Playgroud)

但这不起作用,也不是真正动态的(首先参见......)。

关于这个有什么提示吗?

更新(提供更多输入):

使用调用“动态”分组函数的不同参数预计会得到以下结果。

group-year-week
{:year 2023 :month 1 :value-sums 8} 

group-year-name
[{:year 2023 :name "Name1" :value-sums 5 :values [list of values]}
 {:year 2023 :name "Name2" :value-sums 3 :values [list of values}]
Run Code Online (Sandbox Code Playgroud)

Jam*_*ott 6

你的意思只是:

(defn group-by-keys [group-keys rows]
  (group-by (apply juxt group-keys) rows))
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用它:

(group-by-keys [:week :year] test-data)
Run Code Online (Sandbox Code Playgroud)

这将产生与您的示例相同的结果。