我有一个嵌套的哈希图,其结构类似于以下内容:
(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
如果不存在,则已经创建了一个新密钥。用法如下:
(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"}}}}
如果您希望合并新地图,请update-in
与merge
(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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句