Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 向嵌套树结构中的向量添加元素_Clojure - Fatal编程技术网

Clojure 向嵌套树结构中的向量添加元素

Clojure 向嵌套树结构中的向量添加元素,clojure,Clojure,直接跳进去,更好的方法: (assoc-in {:children [{:children [{:children [{:children [{:children []}]}]}]}]} [:children 0 :children 0 :children 0 :children 0 :children 0] :hello) 我想将:hello插入到:children向量中。上面我是在中使用assoc来完成的 在中是否有比assoc更好的方法? 或者,如果只有as

直接跳进去,更好的方法:

(assoc-in 
    {:children [{:children [{:children [{:children [{:children []}]}]}]}]} 
    [:children 0 :children 0 :children 0 :children 0 :children 0] 
    :hello)
我想将
:hello
插入到
:children
向量中。上面我是在中使用
assoc来完成的

中是否有比assoc更好的方法?
或者,如果只有
assoc in
是唯一的方法,您将如何处理
assoc in
的第二个参数
[k&ks]


也很高兴知道是否有一些东西也可以用于将
:world
插入到任意
:children
的向量中。。。与第三个子项或第二个子项的第一个子项类似。

中的
assoc的向量参数不需要是文本,因此可以根据需要构造它

(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]}]}]}]}]}
或者,对于第一个子对象的第二个子对象的第三个子对象,请按照

(vec (interleave (repeat :children) [0 1 2]))
;=> [:children 0 :children 1 :children 2]
更一般地说,您可以使用在嵌套贴图周围任意移动,例如下降到最后一个子贴图。运动功能有可组合等

(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]}]}]}]}]}

您也可以使用
clojure.walk
进行此操作

(require '[clojure.walk :as w])

(def nested-map  
  {:children [{:children [{:children [{:children [{:children []}]}]}]}]})

(w/postwalk (fn [node] (if (and (vector? node) (empty? node))
                         (conj node :hello)
                         node))
            nested-map)
=> {:children [{:children [{:children [{:children [{:children [:hello]}]}]}]}]}

嗯?您已经可以索引到向量中的不同点;这个索引就是
0
是什么。如果我没弄错的话:是的。看看有没有更好的方法。太棒了,谢谢。特别是对于
交织+重复
和对拉链的引用。