Если вы хотите реализовать это напрямую, я бы предложил что-то вроде этого:
(defn dissoc-descendents [coll descendents]
(let [descendents (if (set? descendents) descendents (set descendents))]
(if (associative? coll)
(reduce
(fn [m [k v]] (if (descendents k)
(dissoc m k)
(let [new-val (dissoc-descendents v descendents)]
(if (identical? new-val v) m (assoc m k new-val)))))
coll
coll)
coll)))
Ключевые замечания, которые следует отметить относительно реализации:
- Имеет смысл преобразоватьпотомки в набор: это позволит проводить быстрые тесты членства, если набор удаляемых ключей большой
- Существует некоторая логика, гарантирующая, что если значение не изменяется, вам не нужно изменять эту частькарты.Это довольно большой выигрыш в производительности, если большие области карты не изменились.