我有这个地图:
{: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}}}