DEV Community

Clarice Bouwer
Clarice Bouwer

Posted on

How to replace nested values in Clojure

You can use clojure.walk/postwalk to replace nested values that exist in maps and vectors.

(defn replace-values [data target-key new-value]
  (clojure.walk/postwalk
   (fn [x]
     (cond
       (map? x) (into {} (map (fn [[k v]] [k (if (= k target-key) new-value v)])) x)
       (vector? x) (vec (map #(replace-values % target-key new-value) x))
       :else x)) data))
Enter fullscreen mode Exit fullscreen mode
(def data {:cart {:something 0 :fruit {:apples 1 :bananas 2 :something 1}} :vegetables [{:eggplants 10 :potatoes 3 :something 0}]})
(replace-values data :something 42)
;; => {:cart {:something 42, :fruit {:apples 1, :bananas 2, :something 42}}, :vegetables [{:eggplants 10, :potatoes 3, :something 42}]}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay