我有一个矢量原子,我想更新一个本身就是地图的条目。
(def vector-atom (atom []))
(swap! vector-atom conj { :id 1 :name "myname" })
我该如何只更新该成员?
在可变的 Java 领域的思维方式中,我会做这样的事情:
(defn find-by-id [id]
(first (filter (fn [entry] (= (:id entry) id))
@vector-atom)))
(defn update-entry [id new-entry]
(let [curr-entry (find-by-id id)
merged-entry (merge curr-entry new-entry)]
###set the curr-entry to merged-entry###))
如果向量的索引对应于:id
s,你可以使用类似的东西
(swap! vector-atom update-in [id] merge new-entry)
如果没有,那么你有两个选择:(1)使用 id -> map 的映射而不是向量和上面的简单解决方案,(2)使用向量和类似以下内容:
(swap! vector-atom
(fn [v]
(let [i (find-index-of-entry v)]
(assoc v i (merge (nth v i) new-entry)))))
find-index-of-entry
可以是向量的简单线性扫描,或者,如果项目按以下顺序排序:id
,二分查找。对于较长的向量来说,线性扫描当然效率极低(因此,如果向量可能较长,则按照上述(1)切换到映射是一个值得考虑的解决方案)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)