我有一个叫app-state的原子,它保存着一张地图。看起来是这样的:
{:skills [{:id 1 :text "hi"} {:id 2 :text "yeah"}]}用:id = 2删除向量中元素的惯用方法是什么?其结果将是:
{:skills [{:id 1 :text "hi"}]}..。到目前为止,我有这样的想法:
(defn new-list [id]
(remove #(= id (:id %)) (get @app-state :skills)))
swap! app-state assoc :skills (new-list 2)很管用,但我觉得这不太对。我想可能是这样的:
swap! app-state update-in [:skills] remove #(= id (:id %))但这似乎行不通。
任何帮助都是非常感谢的!
发布于 2016-01-18 04:22:17
(swap! state update :skills (partial remove (comp #{2} :id)))发布于 2016-01-18 03:53:22
试试这个:
(defn new-list [app-state-map id]
(assoc app-state-map :skills (into [] (remove #(= id (:id %)) (:skills app-state-map)))))
(swap! app-state new-list 2)swap!将把原子的当前值传递给提供它的函数。没有必要自己取消它在函数中的作用。
有关更多细节,请参见文档 on swap!。
发布于 2016-01-18 02:02:59
(def skills {:skills [{:id 1 :text "hi"} {:id 2 :text "yeah"}]})
(defn remove-skill [id]
(update skills :skills (fn [sks] (vec (remove #(= id (:id %)) sks)))))然后,您将能够调用如(remove-skill 1),并看到只剩下另一个(使用:ID2的技能)。
我更喜欢你的方式。这将需要被用来对付一个原子。
https://stackoverflow.com/questions/34845894
复制相似问题