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