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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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,我在REPL上创建了一个结构 {1 {10 {:id 101, :name "Paul"}, 20 {}}, 2 {30 {}, 40 {}}, 3 {50 {}, 60 {}}} 我想给键1添加一个新的kv,这样得到的结构如下所示 {1 {10 {:id 101, :name "1x2"}, 20 {}, 11 {:id 102, :name "Ringo"}}, 2 {30 {}, 40 {}}, 3 {50 {}, 60 {}}}. 我刚刚发现get in update

我在REPL上创建了一个结构

{1 {10 {:id 101, :name "Paul"}, 
    20 {}}, 
2 {30 {}, 40 {}}, 
3 {50 {}, 60 {}}}
我想给键1添加一个新的kv,这样得到的结构如下所示

{1 {10 {:id 101, :name "1x2"}, 20 {}, 11 {:id 102, :name "Ringo"}},
 2 {30 {}, 40 {}}, 3 {50 {}, 60 {}}}.
我刚刚发现get in update in和assoc in用于处理类似的嵌套结构,但无法理解如何在元素中添加新元素。在我的应用程序中,这一切都被包装在一个ref中,并用dosync/alter进行更新,但现在,我只想在REPL上实现这一点

也许我已经研究这个问题太久了,但是在中使用assoc或assoc的任何尝试都只会改变已经存在的内容,并且不会附加新元素

根据您的输入

(def input
  {1 {10 {:id 101 :name "Paul"}
      20 {}}
   2 {30 {} 40 {}}
   3 {50 {} 60 {}}})
可以使用assoc in将元素添加到具有键1的嵌套映射中,如下所示:

(assoc-in input [1 11] {:id 102 :name "Ringo"})
产生

{1 {10 {:id 101 :name "Paul"}
    11 {:id 102 :name "Ringo"}
    20 {}}
 2 {30 {} 40 {}}
 3 {50 {} 60 {}}}
Assoc in不需要一直指向结构的最深层

如果在中使用两个assoc调用,则可以使用第二个调用将名称“Paul”更改为“1x2”,如您的示例所示:

(assoc-in
  (assoc-in input [1 11] {:id 102 :name "Ringo"})
  [1 10 :name] "1x2"))
返回

{1 {10 {:id 101 :name "1x2"}
    11 {:id 102 :name "Ringo"}
    20 {}}
 2 {30 {} 40 {}}
 3 {50 {} 60 {}}}

值得一提的是,如果必须指向现有节点,您仍然可以这样做:

(update-in input [1] assoc 11 
  {:id 102 :name "Ringo"})
非常感谢。这是映射[11]{}中的(assoc)。我假设向量必须指向树中的一个现有节点。这是一个很大的帮助,在函数中找到所有这些*-是非常有趣的一天。