Вы на самом деле не хотите ничего сортировать или разбивать: это просто время процессора, потраченное ни на что, и в конце вы получаете неуклюжую структуру данных (список карт) вместо чего-то более удобного, карта с ключом "важный" :a
значение.
Скорее, я бы написал это как сокращение, где каждый шаг использует merge-with
в соответствующем подразделе конечной карты:
(defn combine-by [k ms]
(reduce (fn [acc m]
(update acc (get m k)
(partial merge-with into)
(dissoc m k)))
{}, ms))
после чего у нас
user=> (combine-by :a '({:a 1 :b ["red" "blue"]}
{:a 2 :b ["green"]}
{:a 1 :b ["yellow"]}
{:a 2 :b ["orange"]}))
{1 {:b ["red" "blue" "yellow"]}, 2 {:b ["green" "orange"]}}
, который используется для удобного поиска карты по определенному :a
, или, если вы предпочитаете вернуть результаты в виде списка, вы можете легко развернуть его.