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)