clojure/clojurescript 只更改嵌套映射中的一个键

clojure/clojurescript change just one key in nested map

我有这张地图:

{:a {:a {:a 1 :b 2}}}

我想把它变成这个:

{:a {:a {:x 1 :b 2}}}

我试过了,但是 - 当然 - 替换了 all :a:

(clojure.walk/postwalk-replace {:a :c} {:a {:a {:a 1 :b 2}}})

-> {:c {:c {:c 1, :b 2}}}

我试过了,但得到了一个我什至无法解释的结果:

(update-in {:a {:a {:a 1 :b 2}}} [:a :a] clojure.walk/postwalk-replace {:a :c})

-> {:a {:a {1 :c}}}

我能做什么?

有一个clojure.set/rename-keys。例如

(update-in {:a {:a {:a 1 :b 2}}} [:a :a] clojure.set/rename-keys {:a :c})
; → {:a {:a {:b 2, :c 1}}}

您的示例失败的原因是参数顺序。 postwalk-replace 需要第一个参数作为替换映射 以及要重命名的内容的第二个参数。但是 update-in 总是将遍历的东西作为第一个参数发送到函数中。 所以你需要处理参数(例如通过 anon-fn 或 partial):

(update-in {:a {:a {:a 1 :b 2}}} [:a :a] (partial clojure.walk/postwalk-replace {:a :c}))
; → {:a {:a {:b 2, :c 1}}}