我有一个我在REPL创建的结构,
{1 {10 {:id 101, :name "Paul"},
20 {}},
2 {30 {}, 40 {}},
3 {50 {}, 60 {}}}
Run Code Online (Sandbox Code Playgroud)
我想在键1中添加一个新的kv,这样得到的结构看起来像这样,
{1 {10 {:id 101, :name "1x2"}, 20 {}, 11 {:id 102, :name "Ringo"}},
2 {30 {}, 40 {}}, 3 {50 {}, 60 {}}}.
Run Code Online (Sandbox Code Playgroud)
我刚刚发现了get-in update-in和assoc-in来处理这些嵌套结构,但无法弄清楚如何在元素中添加新元素.在我的应用程序中,这全部包含在ref中并使用dosync/alter进行更新,但是现在,我只想在REPL中执行此操作.
也许我只是在看这个太久了,但任何使用assoc或assoc-in的尝试只会改变已经存在的东西,并且不会附加新的元素.
鉴于您的意见
(def input
{1 {10 {:id 101 :name "Paul"}
20 {}}
2 {30 {} 40 {}}
3 {50 {} 60 {}}})
Run Code Online (Sandbox Code Playgroud)
您可以使用assoc-in将键元素1添加到嵌套映射中,如下所示:
(assoc-in input [1 11] {:id 102 :name "Ringo"})
Run Code Online (Sandbox Code Playgroud)
产量
{1 {10 {:id 101 :name "Paul"}
11 {:id 102 :name "Ringo"}
20 {}}
2 {30 {} 40 {}}
3 {50 {} 60 {}}}
Run Code Online (Sandbox Code Playgroud)
Assoc-in不需要一直指向结构的最深层.
如果您使用两个来自assoc-in的调用,则可以使用第二个调用根据您的示例将名称"Paul"更改为"1x2":
(assoc-in
(assoc-in input [1 11] {:id 102 :name "Ringo"})
[1 10 :name] "1x2"))
Run Code Online (Sandbox Code Playgroud)
哪个回报
{1 {10 {:id 101 :name "1x2"}
11 {:id 102 :name "Ringo"}
20 {}}
2 {30 {} 40 {}}
3 {50 {} 60 {}}}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
669 次 |
| 最近记录: |