clojure - 追加到嵌套关联结构中

标签 clojure

我有一个在 REPL 创建的结构,

{1 {10 {:id 101, :name "Paul"}, 
    20 {}}, 
2 {30 {}, 40 {}}, 
3 {50 {}, 60 {}}}

我想向键 1 添加一个新的 k v ,使得结果结构如下所示,

{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-in 的尝试都会改变已经存在的内容,并且不会附加新元素。

最佳答案

根据您的意见

(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-in 使用两次调用,则可以根据示例使用第二次调用将名称“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 {}}}

关于clojure - 追加到嵌套关联结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6501299/

相关文章:

clojure - 在 Environ (Clojure) 中定义函数,然后在代码中使用它

clojure - 如何在 Datomic 中表示具有现有 UUID 的实体?

file - Clojure 中的原子文件替换

clojure - clojure 中嵌套映射到嵌套向量

emacs - Org-Babel Clojure Cider NRepl 坏了?

unit-testing - Clojure 的最佳单元测试框架?

clojure - 这种形式构造有什么问题?

clojure - 如何将关键字转换为字符串并保留冒号

clojure - 我可以只在 Java 类上使用 Clojure 多方法吗?

vim - Racket xrepl 的内置帮助文本(非 html)文档