跳进去,更好的方式:
(assoc-in
{:children [{:children [{:children [{:children [{:children []}]}]}]}]}
[:children 0 :children 0 :children 0 :children 0 :children 0]
:hello)
Run Code Online (Sandbox Code Playgroud)
我想插入:hello最深的:children矢量.以上我正在做 assoc-in.
有比这更好的方法assoc-in吗?
或者,如果时间assoc-in是唯一的方式,你将如何处理assoc-in第二个论点[k & ks]?
也很好知道是否有一些东西也适用于插入:world和任意:children的矢量...像第三个孩子或第二个孩子的第一个孩子.
vector参数assoc-in不必是文字,因此您可以根据需要构造它.
(def nested-map
{:children [{:children [{:children [{:children [{:children []}]}]}]}]})
(assoc-in nested-map (vec (take 10 (cycle [:children 0]))) :hello)
;=> {:children [{:children [{:children [{:children [{:children [:hello]}]}]}]}]}
Run Code Online (Sandbox Code Playgroud)
或者对于第1个孩子的第2个孩子的第3个孩子,构建像
(vec (interleave (repeat :children) [0 1 2]))
;=> [:children 0 :children 1 :children 2]
Run Code Online (Sandbox Code Playgroud)
更一般地说,你可以使用拉链随意移动嵌套地图,例如下降最后一个孩子.运动功能可以组成等.
(require '[clojure.zip :as zip])
(def z (zip/zipper map? :children #(assoc % :children (vec %2)) nested-map))
(-> (ffirst (filter (comp zip/end? second) ; find last
(partition 2 1 (iterate zip/next z))))
(zip/edit (constantly :hello)) ; change to :hello
zip/root) ; bubble up changes
;=> {:children [{:children [{:children [{:children [{:children [:hello]}]}]}]}]}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
602 次 |
| 最近记录: |