gpt4 book ai didi

clojure - 如何在嵌套 HashMap 中合并?

转载 作者:行者123 更新时间:2023-12-02 22:15:14 24 4
gpt4 key购买 nike

我有一个嵌套的 HashMap ,其结构如下:

(def pathmap {:order {:genus {:species {:cat2 "data", :cat1 "data"}}}})

我需要的是像 assoc-in 这样的函数,它允许我向最里面的嵌套映射添加新的键值对,而不是简单地替换已有的键值对。例如:

(my-assoc-merge pathmap [:order :genus :species] {:cat3 "data"})
;=> {:order {:genus {:species {:cat3 "data" :cat2 "data", :cat1 "data"}}}}

我想我可以通过稍微改变 assoc-in 函数以使用 merge-with 和 union 来轻松地做到这一点:

(defn my-assoc-merge
[m [k & ks] v]
(if ks
(assoc m k (my-assoc-merge (get m k) ks v))
(assoc m k (merge-with clojure.set/union (get m k '{}) v))))

不幸的是,这给了我错误“CompilerException java.lang.UnsupportedOperationException:此类型不支持计数:关键字,编译:(core.clj:34:12)”。我哪里出错了?

最佳答案

实际上,assoc-in 已经创建了一个新 key (如果它不存在)。使用方法如下:

(def pathmap {:order {:genus {:species {:cat2 "data", :cat1 "data"}}}})

(assoc-in pathmap [:order :genus :species :cat3] "data")
;=> {:order {:genus {:species {:cat2 "data", :cat3 "data", :cat1 "data"}}}}

如果您希望合并新 map ,请使用 update-inmerge

(update-in pathmap [:order :genus :species] merge {:cat3 "data"})
;=> {:order {:genus {:species {:cat2 "data", :cat3 "data", :cat1 "data"}}}}

您的my-assoc-merge的问题是在集合上工作的union。将 merge-with 更改为 merge 并删除 union

关于clojure - 如何在嵌套 HashMap 中合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22661818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com