试剂原子交换!将状态更改为键的所有值

Reagent atom swap! change state to all values from keys

我们有一个带有一些键和布尔值的原子:

(def btns (reagent.core/atom {:a true :b true :c true}))

我需要更改所有键的状态,如下所示:{:a false :b false :c false}

我试过了,但不是很好的解决方案,而且没有用:

   (for [btn @btns]
        (swap! btns assoc (key btn) false))

您可以通过这种方式更新多个密钥:

user> (def a (atom {:a true :b true :c true}))
;;=> #<Atom@af0fa6a: {:a true, :b true, :c true}>

user> (swap! a into {:b false :c false})
;;=> {:a true, :b false, :c false}

或者像这样:

user> (swap! a assoc :a false :c false)
;;=> {:a false, :b true, :c false}

如果你想将 atom 中的所有键都更新为 false,它也可以是这样的:

user> (reset! a (zipmap (keys @a) (repeat false)))
;;=> {:a false, :b false, :c false}

或者像这样:

user> (swap! a #(zipmap (keys %) (repeat false)))
;;=> {:a false, :b false, :c false}

更新

此外,最好将 util 函数抽象出来,使其更具可读性:

(defn assoc-all-keys [data val]
  (zipmap (keys data) (repeat val)))

user> (swap! a assoc-all-keys false)
;;=> {:a false, :b false, :c false}