如何更新矢量中的记录,符合某些条件?

时间:2014-04-08 23:17:00

标签: clojure

我正在尝试更新符合特定条件的向量中的记录。

(defrecord Item [id name description])

(def items
  (ref [
    (->Item "1" "Cookies" "Good tasting!")
    (->Item "2" "Blueberries" "Healthy!")

  ])
)

我该怎么办? “将项目名称设置为”foo“,其中id等于1”?

我可能需要像

这样的东西
(dosync (commute items ???? ))

无法想出????

我发现例如函数update-in in docs

但是1.无法找到带有记录的示例,2。不确定我是否可以使用它来更新与我用于执行查询的字段不同的字段。在示例中,字段似乎是相同的。

完整的用例:我有一个更新操作的web服务,我得到一个包含项目ID的地图和必须更新的可选字段。

我是Clojure的新手。我实现了删除功能,通过id,它可以工作:

(commute items #(remove (fn [x](= (:id x) id)) %))

也可以通过id找到,这可能是更新方向的一步:

(nth (filtered (filter #(= (:id %) id) @items)) 0)

但不知道如何在我的矢量中更新记录......

1 个答案:

答案 0 :(得分:3)

您可以使用assoc制作一份记录的副本,并更换一些密钥。

(dosync
 (commute items
          #(mapv (fn [i]
                   (if (= (:id i) "1")
                     (assoc i :name "foo")
                     i))
                 %)))