Clojure:向向量添加元素在地图上

sil*_*lau 4 dictionary vector clojure

我有这张地图

(def m {:a "aaa" :b {:c ["ss" "gg"]}})
Run Code Online (Sandbox Code Playgroud)

我想将其更新为此(将"uu"添加到向量:c):

{:a "aaa" :b {:c ["ss" "gg" "uu"]}}
Run Code Online (Sandbox Code Playgroud)

这就是我想出来的,我讨厌它:

(assoc-in m [:b :c] (conj (get-in m [:b :c]) "uu"))
Run Code Online (Sandbox Code Playgroud)

应该怎么做?

Chr*_*phy 7

(update-in m [:b :c] conj "uu")
Run Code Online (Sandbox Code Playgroud)

我认为它的方式是,update-in 让你有,并要求其接收状态的功能存在.此功能(conj此处)还接收剩余参数.所以这里["ss" "gg"]将用"uu"和调用:c.

["ss" "gg" "uu"]没有得到任何初始状态,因此在你的榜样,你都不得不劳动创造的是一遍.

  • 但要注意陷阱:如果地图中没有密钥,`conj`会创建一个列表,而不是一个向量:`(update-in m [:b:d] conj"xxx")`=>`{: a"aaa",:b {:c ["ss""gg"],:d("xxx")}}`.要避免这种情况,你应该处理`nil`值,如下所示:`(update-in m [:b:d](fnil conj [])"xxx")`=>`{:a"aaa",:b {:c ["ss""gg"],:d ["xxx"]}}` (5认同)