var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
व्याख्या
Immutable.js संग्रह को अपडेट करना हमेशा उन संग्रहों के नए संस्करणों को मूल अपरिवर्तित छोड़ देता है। उसके कारण, हम JavaScript के list[2].count = 4
म्यूटेशन सिंटैक्स का उपयोग नहीं कर सकते हैं । इसके बजाय हमें विधियों को कॉल करने की आवश्यकता है, जैसे हम जावा संग्रह कक्षाओं के साथ कर सकते हैं।
आइए एक सरल उदाहरण से शुरू करते हैं: एक सूची में सिर्फ मायने रखता है।
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
अब अगर हम 3rd आइटम को अपडेट करना चाहते हैं, तो एक प्लेन JS सरणी दिख सकती है counts[2] = 4
:। चूंकि हम म्यूटेशन का उपयोग नहीं कर सकते हैं, और हमें कॉल करने की आवश्यकता है, इसके बजाय हम उपयोग कर सकते हैं: counts.set(2, 4)
- इसका मतलब है कि 4
इंडेक्स पर मान सेट करें 2
।
गहरा अद्यतन
आपके द्वारा दिए गए उदाहरण में नेस्टेड डेटा है। हम अभी set()
शुरुआती संग्रह पर उपयोग नहीं कर सकते ।
Immutable.js संग्रह में "इन" के साथ समाप्त होने वाले नामों के साथ तरीकों का एक परिवार है जो आपको एक नेस्टेड सेट में गहरे बदलाव करने की अनुमति देता है। अधिकांश सामान्य अद्यतन विधियों में एक संबंधित "इन" विधि है। उदाहरण के लिए set
वहाँ है setIn
। सूचकांक या एक कुंजी को पहले तर्क के रूप में स्वीकार करने के बजाय, ये "इन" तरीके "कुंजी पथ" को स्वीकार करते हैं। मुख्य पथ अनुक्रमणिका या कुंजियों का एक सरणी है जो दिखाता है कि आप जिस मूल्य को अपडेट करना चाहते हैं उसे कैसे प्राप्त करें।
अपने उदाहरण में, आप सूची 2 में सूची में आइटम को अद्यतन करना चाहते थे, और फिर उस आइटम के भीतर कुंजी "गणना" पर मूल्य। तो प्रमुख मार्ग होगा [2, "count"]
। setIn
विधि का दूसरा पैरामीटर उसी तरह काम करता है set
, यह नया मूल्य है जिसे हम वहां रखना चाहते हैं, इसलिए:
list = list.setIn([2, "count"], 4)
सही कुंजी पथ ढूँढना
एक कदम आगे बढ़ते हुए, आपने वास्तव में कहा था कि आप उस आइटम को अपडेट करना चाहते हैं जहां नाम "तीन" है जो सिर्फ 3 आइटम से अलग है। उदाहरण के लिए, शायद आपकी सूची को क्रमबद्ध नहीं किया गया है, या शायद "दो" नामक आइटम को पहले हटा दिया गया था? इसका मतलब है कि पहले हमें यह सुनिश्चित करने की आवश्यकता है कि हम वास्तव में सही मुख्य मार्ग को जानते हैं! इसके लिए हम findIndex()
विधि का उपयोग कर सकते हैं (जो, वैसे, लगभग Array # findIndex की तरह काम करता है )।
एक बार जब हम उस सूची में सूची पा लेते हैं जिसमें वह आइटम है जिसे हम अपडेट करना चाहते हैं, तो हम उस मान को मुख्य पथ प्रदान कर सकते हैं जिसे हम अपडेट करना चाहते हैं:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
एनबी: Set
बनामUpdate
मूल प्रश्न सेट विधियों के बजाय अद्यतन विधियों का उल्लेख करता है। मैं उस फ़ंक्शन में दूसरे तर्क की व्याख्या करता हूं (कहा जाता है updater
), क्योंकि यह अलग है set()
। जबकि दूसरा तर्क set()
वह नया मूल्य है जो हम चाहते हैं, दूसरा तर्क update()
एक फ़ंक्शन है जो पिछले मूल्य को स्वीकार करता है और हम जो नया मूल्य चाहते हैं उसे वापस करते हैं। फिर, updateIn()
"इन" भिन्नता है update()
जिसमें से एक प्रमुख मार्ग को स्वीकार करता है।
उदाहरण के लिए कहें कि हम आपके उदाहरण की एक भिन्नता चाहते थे जो गिनती को केवल निर्धारित नहीं करता था 4
, बल्कि मौजूदा गणना को बढ़ाता है, हम एक फ़ंक्शन प्रदान कर सकते हैं जो मौजूदा मूल्य में एक जोड़ता है:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)