एकाधिक मानों को अपडेट करने के लिए, आप पहले से भरे हुए संचयक को कम करने और निम्न संग्रह के उस सदस्य पर एक फ़ंक्शन लागू करने का लाभ भी ले सकते हैं। यदि आप इसे एक सामान्यीकृत समारोह बना
=> (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}
कुंजी वैक्टर में संलग्न किया जा करने की जरूरत के बारे में पता हो, लेकिन आप अभी भी मूल अद्यतन की तरह नेस्टेड संरचनाओं में एक से अधिक अद्यतन-इन कर सकते हैं।
, आप स्वचालित रूप से coll ?:
(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))
जो वैक्टर में कुंजी लपेटकर की आवश्यकता के बिना एकल स्तर/कुंजी अद्यतन के लिए अनुमति होगी के साथ यह परीक्षण से एक चाबी के ऊपर एक वेक्टर लपेट सकता है
=> (multi-update-in {:a 1 :b 2 :c 3 :d 4} [:a :c] inc)
{:a 2, :c 4, :b 2, :d 4}
लेकिन अभी भी नेस्ट अपडेट
(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"}}
एक मूल्य के बारे में कैसे? तो अगर मैं चाहता हूं कि {ए: 7: बी 4}। क्या होगा यदि मेरे पास पूर्णांक के मानचित्रों का नक्शा है और कहें key1 => subkey1 => integer ++ के मान में वृद्धि करना चाहते हैं? –
@ डेविडविल्लियम्स (अपडेट-इन-मैप [: बी] inc) ;; => {: 1,: बी 3} –
समझ गया, यह एक नया नक्शा बनाता है, सही? मैं सोच रहा हूं कि यह राज्य को कठिन बना देता है। उदाहरण के लिए, बेयस क्लासिफायरफायर बनाने के लिए, मुझे लगातार बहुस्तरीय संरचना में अद्यतन चीजों की लम्बाई रखने की आवश्यकता है। key1 => subkey1 => पूर्णांक। क्या मुझे सोम dosync और स्वैप जादू करने की ज़रूरत होगी? –