我在这样的集合中有一系列项目:
(def my-set
#{
{:id "ab" :a 1 :b 2}
{:id "abc" :a 1 :b 2}
{:id "abcd" :a 1 :b 2}
}
)
:我希望更新以下项目之一:
(update-in-set my-set :id "abc" {:id "abc" :a 6 :b 20})
。会回来:
#{
{:id "ab" :a 1 :b 2}
{:id "abc" :a 6 :b 20}
{:id "abcd" :a 1 :b 2}
}
:是否有任何Clojure内置功能或其他简单的方法来执行此操作?
最后我这样做了:
(defn update-in-set [my-set key value new-record]
(merge (clojure.set/select #(not= (get % key) value) my-set ) new-record)
)
答案 0 :(得分:3)
我想知道你是不是应该使用地图而不是一个集合,以id为关键。然后,您可以使用assoc
轻松执行您想要执行的操作。
您遇到问题,因为集合并不真正想要更新值 - 每个项目都是唯一的,无论是否存在 - 所以您需要做的是删除旧值并添加新值。使用conj
和disj
时,我可以更轻松地完成此操作:
(conj (disj #{'a 'b 'c} 'a) 'e)
哪会删除'a并添加'e。这假设你有办法从“密钥”中获取完整的项目。