Aby zaktualizować wiele wartości, możesz również skorzystać z funkcji zmniejszania liczby pobranych już akumulatorów i zastosować do nich funkcję oraz każdy element poniższej kolekcji.
=> (reduce (fn [a k] (update-in a k inc)) {:a 1 :b 2 :c 3 :d 4} [[:a] [:c]])
{:a 2, :c 4, :b 2, :d 4}
Bądź świadomy klawiszy które muszą być zawarte w wektorach, ale nadal można zrobić wiele update-iny w zagnieżdżonych struktur podobnych do oryginalnej aktualizacji.
Jeśli udało ci się uogólnioną funkcję, mógłby automatycznie owinąć wektor nad kluczem sprawdzając je za pomocą pot ?:
(defn multi-update-in
[m v f & args]
(reduce
(fn [acc p] (apply
(partial update-in acc (if (coll? p) p (vector p)) f)
args)) m v))
która pozwoliłaby na jednopoziomowych/kLUCZ aktualizacji bez konieczności zawijania klawiszy w wektorach
=> (multi-update-in {:a 1 :b 2 :c 3 :d 4} [:a :c] inc)
{:a 2, :c 4, :b 2, :d 4}
ale nadal będą mogli zrobić zagnieżdżonych aktualizacji
(def people
{"keith" {:age 27 :hobby "needlefelting"}
"penelope" {:age 39 :hobby "thaiboxing"}
"brian" {:age 12 :hobby "rocket science"}})
=> (multi-update-in people [["keith" :age] ["brian" :age]] inc)
{"keith" {:age 28, :hobby "needlefelting"},
"penelope" {:age 39, :hobby "thaiboxing"},
"brian" {:age 13, :hobby "rocket science"}}
Co powiesz na jedną wartość? A co jeśli chcę {a: 7: b 4}. Co zrobić, jeśli mam mapę map całkowitych i chcę zwiększyć wartość słowa klucz1 => podklucz1 => liczba całkowita ++? –
@DavidWilliams (update-in my-map [: b] inc) ;; => {: a 1,: b 3} –
Rozumiem, to tworzy nową mapę, prawda? Myślę, że to utrudnia utrzymanie stanu. Na przykład, aby utworzyć klasyfikator typu Bayes, muszę stale aktualizować listę rzeczy w wielopoziomowej strukturze. key1 => podklucz1 => liczba całkowita. Czy powinienem wykonać som dosync i zamienić magię? –