正在使用交换!在嵌套地图上

问题描述 投票:2回答:2

我正在遵循《专业Clojure》一书的第6章。>

应用状态目前定义如下:

(defonce app-state                                          
  (reagent/atom
    {:projects
     {"aaa"
      {:title "Build Whip"
       :stories
       {1 {:title "Design a data model for projects and stories"    
           :status "done"                                           
           :order 1}                                                
        2 {:title "Create a story title entry form"                 
           :order 2}    
        3 {:title "Implement a way to finish stories"
           :order 3}}}}}))                                            

我需要使用swap!添加一个新的键值来表示一个新的故事,该键值由具有给定字段值的id来键。

(defn add-story! [app-state project-id title status]     ;
  ; Q. How to use swap! to add a key value pair into :stories?
  (swap! app-state update [:projects project-id :stories] assoc      <- INCORRECT CODE HERE
         (unique) {:title title
                   :status status
                   :order (inc (max-order app-state project-id))}))

此处未显示的唯一函数只会生成任何唯一的uuid。最大阶函数可以得到最大阶。由于书中的章节与实际提供的最终代码不一致,因此我不得不对其进行修改。这是我的最大订单版本:

(defn max-order [app-state project-id]
  (apply max 0 (map :order (vals (get-in @app-state [:projects project-id :stories])))))

问题

:如何使用swap!:stories中添加新的键值?

我尝试了一下,但现在它打败了我。

我确实感觉到此嵌套地图不是最好的表示形式-在作为下载提供的最终代码中,作者已更改为关系类型更多的模型,其中项目和故事均是顶级实体,故事包含project_id ,但先解决swap!的第一个用法,然后再继续使用该方法将非常好。

我正在遵循《专业Clojure》一书的第6章。目前,应用状态的定义如下:(防御应用状态(试剂/原子{:projects {...

clojure
2个回答
3
投票

我认为在这种情况下,您可以只使用assoc-in,它比update-in更为简单,并且可以更好地描述您要实现的目标:


1
投票

请务必每天学习Clojure CheatSheet!另外,还有documentation references here

© www.soinside.com 2019 - 2024. All rights reserved.