Clojure从map中替换字符串值

时间:2018-04-03 09:01:16

标签: clojure

(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,但它不起作用。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

您的代码中存在两个问题。首先,在您的if中,您要将订单条目的:orderid:orderid的{​​{1}}进行比较,这是不合理的,因为{{1}一个数字,而不是一个地图。您要执行的操作是将订单条目的param-dataparam-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)