Вот то, что я придумал, это своего рода специфическая c структура данных, поэтому она довольно специфична c code
Первый шаг - настроить данные так, чтобы мы могли работать с ними. merge-with
(defn get-data [val]
(as-> val ?
(first ?)
(:nums ?)
(select-keys ? [:data])))
Тогда последним шагом будет позвонить merge-with
и собрать его вместе
(def x '(({:nums {:test number?, :data (1)}})
{:Other ()}
({:nums {:test number?, :data (2)}})
({:nums {:test number?, :data (3 4)}}))
(as-> x ?
(map get-data ?)
(apply merge-with concat ?)
(assoc ? :test 'number?)
(list ?)
(list ?)
(conj ? {:Other '()})
(reverse ?))
Если вы искали что-то более общее c, вы ' мне придётся придти мне с более общей c структурой данных.
Я думаю, то, что вы искали, в основном содержится в строке (apply merge-with concat ?)
, которая выполняет большую часть работы.
Эта функция берет список карт и применяет функцию, в данном случае concat
к значениям в этих картах.
См. (doc merge-with)
в вашем REPL для получения дополнительной информации.
Как последнее усилие, вы также можете быть заинтересованы в библиотеке specter clojure, которая превосходна в этом типе глубоко вложенного преобразования данных.
Надеюсь, это поможет!