Clojure 附加到嵌套的关联结构中
我在REPL上创建了一个结构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
{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)。我假设向量必须指向树中的一个现有节点。这是一个很大的帮助,在函数中找到所有这些*-是非常有趣的一天。