(def database (atom
[{:orderid 0 :productid 0 :description "A" :amount 2 :state "active"}
{:orderid 1 :productid 1 :description "A" :amount 2 :state "active"}]))
(defn edit-order
[param-data]
(swap! database
(fn [old-orders]
(mapv (fn [order]
(if (= (:orderid order)
(:orderid param-data))
(assoc-in database [:state] "deleted")
order))
old-orders)))
)
(edit-order 0)
我想在提供订单ID后将“有效”替换为“已删除”。我尝试使用assoc-in,但它不起作用。谢谢你的帮助。
答案 0 :(得分:0)
您的代码中存在两个问题。首先,在您的if
中,您要将订单条目的:orderid
与:orderid
的{{1}}进行比较,这是不合理的,因为{{1}一个数字,而不是一个地图。您要执行的操作是将订单条目的param-data
与param-data
的值进行比较,如下所示:
:orderid
接下来,您似乎对您在映射功能中所做的事情感到有些困惑。在param-data
的else分支中,您返回一个订单条目,这是正确的,因为您在所有订单的向量上进行映射。但是在另一个分支("然后"分支)中,您正试图在(if (= (:orderid order)
param-data)
上使用if
,这是您不想要的,因为{{ 1}}将返回完整订单列表的更新版本。我认为您想要做的只是在assoc-in
参数上使用database
,如下所示:
assoc-in
这使得完整功能看起来像这样:
assoc
答案 1 :(得分:0)
您现在的代码有两个问题:
(def database (atom
[{:orderid 0 :productid 0 :description "A" :amount 2 :state "active"}
{:orderid 1 :productid 1 :description "A" :amount 2 :state "active"}]))
(defn edit-order
[param-data]
(swap! database
(fn [old-orders]
(mapv (fn [order]
(if (= (:orderid order)
(:orderid param-data)) ;; Issue 1
(assoc-in database [:state] "deleted") ;; Issue 2
order))
old-orders)))
)
(edit-order 0)
问题1源于您致电edit-order
的方式 - 那里没有:orderid
键,它只是一个数字。
问题2是你在拥有Atom的Var上运行assoc-in
,而你正在swap!
内修改Atom,迭代存储在那里的订单。解决了这两个问题的工作代码:
(def database
(atom
[{:orderid 0 :productid 0 :description "A" :amount 2 :state "active"}
{:orderid 1 :productid 1 :description "A" :amount 2 :state "active"}]))
(defn edit-order
[param-data]
(swap! database
(fn [old-orders]
(mapv (fn [order]
(if (= (:orderid order) param-data)
(assoc order :state "deleted")
order))
old-orders))))
(edit-order 0)