You can use clojure.walk. Or I believe specter can do that too.
Specter would be a better investment if you’re looking to do more and more data transformation and manipulation of deeply nested structures. But learning its DSL initially is more short term overhead.
While clojure.walk to write a single remove nil util function might be simpler at first, it won’t scale the same way in terms of usability. But if that’s all you need, at least its standard in Clojure and doesn’t depend on a lib.
If you just want to do some custom walk and replace operations, clojure.walk is good although it is
relatively complicated to reason about.
If you have the shape of the data and you want the input data conform to your shape of data, clojure.spec is good for this task, but remember it is not fast and increase file size for cljs.