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



我有这个地图:

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

我想把它变成这个:

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

我试过了,但-当然-得到了所有: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}}}

最新更新