आप जैसे पाठक MUO का समर्थन करने में मदद करते हैं। जब आप हमारी साइट पर लिंक का उपयोग करके खरीदारी करते हैं, तो हम संबद्ध कमीशन अर्जित कर सकते हैं। और पढ़ें।

पारंपरिक लूप का उपयोग करके डेटा संग्रह पर पुनरावृति जल्दी से बोझिल और धीमी हो सकती है, खासकर जब भारी मात्रा में डेटा से निपटना हो।

जावास्क्रिप्ट जेनरेटर और इटरेटर्स बड़े डेटा संग्रहों पर कुशलतापूर्वक पुनरावृति के लिए एक समाधान प्रदान करते हैं। उनका उपयोग करके, आप पुनरावृत्ति प्रवाह को नियंत्रित कर सकते हैं, एक बार में मान प्राप्त कर सकते हैं, और पुनरावृत्ति प्रक्रिया को रोक सकते हैं और फिर से शुरू कर सकते हैं।

यहां आप एक जावास्क्रिप्ट इटरेटर की मूल बातें और इंटर्नल्स को कवर करेंगे और आप मैन्युअल रूप से और जनरेटर का उपयोग करके एक इटरेटर कैसे उत्पन्न कर सकते हैं।

जावास्क्रिप्ट इटरेटर्स

इटरेटर एक जावास्क्रिप्ट ऑब्जेक्ट है जो इटरेटर प्रोटोकॉल को लागू करता है। ये वस्तुएं ए होने से ऐसा करती हैं अगला तरीका। यह विधि एक वस्तु लौटाती है जो लागू करती है इटरेटर परिणाम इंटरफेस।

इटरेटर परिणाम इंटरफ़ेस में दो गुण शामिल हैं: पूर्ण और कीमत. पूर्ण संपत्ति एक बूलियन है जो वापस आती है

instagram viewer
असत्य यदि पुनरावर्तक इसके अनुक्रम में अगला मान उत्पन्न कर सकता है या सत्य अगर इटरेटर ने अपना अनुक्रम पूरा कर लिया है।

कीमत संपत्ति एक जावास्क्रिप्ट मान है जो इसके अनुक्रम के दौरान पुनरावर्तक द्वारा लौटाया जाता है। जब एक पुनरावर्तक अपने अनुक्रम को पूरा करता है (जब पूर्णसत्य), यह संपत्ति वापस आती है अपरिभाषित.

जैसा कि नाम से पता चलता है, पुनरावृत्तियाँ आपको जावास्क्रिप्ट वस्तुओं जैसे सरणियों या मानचित्रों पर "पुनरावृत्ति" करने की अनुमति देती हैं। यह व्यवहार चलने योग्य प्रोटोकॉल के कारण संभव है।

जावास्क्रिप्ट में, पुनरावृत्त प्रोटोकॉल उन वस्तुओं को परिभाषित करने का एक मानक तरीका है जिन्हें आप पुनरावृत्त कर सकते हैं, जैसे कि a के लिए कुंडली।

उदाहरण के लिए:

कॉन्स्ट फल = ["केला", "आम", "सेब", "अंगूर"];

के लिए (कॉन्स्ट इटरेटर का फल) {
सांत्वना देनालॉग (इटरेटर);
}

/*
केला
आम
सेब
अंगूर
*/

यह उदाहरण दोहराता है फल ए का उपयोग कर सरणी के लिए कुंडली। प्रत्येक पुनरावृत्ति में यह वर्तमान मान को कंसोल में लॉग करता है। यह संभव है क्योंकि सरणियाँ चलने योग्य हैं।

कुछ JavaScript प्रकार, जैसे Arrays, Strings, सेट, और मानचित्र, बिल्ट-इन पुनरावर्तनीय हैं क्योंकि वे (या उनकी प्रोटोटाइप श्रृंखला की वस्तुओं में से एक) एक को लागू करते हैं @@पुनरावर्तक तरीका।

अन्य प्रकार, जैसे कि वस्तुएँ, डिफ़ॉल्ट रूप से चलने योग्य नहीं हैं।

उदाहरण के लिए:

कॉन्स्ट iterObject = {
कारें: ["टेस्ला", "बीएमडब्ल्यू", "टोयोटा"],
जानवरों: ["बिल्ली", "कुत्ता", "हैम्स्टर"],
खाना: ["बर्गर", "पिज़्ज़ा", "पास्ता"],
};

के लिए (कॉन्स्ट इटरेटर का iterObject) {
सांत्वना देनालॉग (इटरेटर);
}

// लेखन त्रुटि: iterObject चलने योग्य नहीं है

यह उदाहरण दर्शाता है कि क्या होता है जब आप किसी ऐसी वस्तु पर पुनरावृति करने का प्रयास करते हैं जो चलने योग्य नहीं है।

वस्तु को चलने योग्य बनाना

किसी वस्तु को पुनरावर्तनीय बनाने के लिए, आपको एक क्रियान्वित करना होगा प्रतीक.इटरेटर वस्तु पर विधि। पुनरावर्तनीय बनने के लिए, इस विधि को एक वस्तु वापस करनी चाहिए जो इसे लागू करती है इटरेटर परिणाम इंटरफेस।

प्रतीक.इटरेटर प्रतीक उसी उद्देश्य को पूरा करता है @@पुनरावर्तक और "विनिर्देशन" में परस्पर उपयोग किया जा सकता है लेकिन कोड के रूप में नहीं @@पुनरावर्तक मान्य जावास्क्रिप्ट सिंटैक्स नहीं है।

नीचे दिए गए कोड ब्लॉक एक उदाहरण प्रदान करते हैं कि कैसे किसी वस्तु को उपयोग करने योग्य बनाया जाए iterObject.

सबसे पहले, जोड़ें प्रतीक.इटरेटर करने की विधि iterObject का उपयोग करते हुए एक समारोह घोषणा।

जैसे इतना:

iterObject [प्रतीकइटरेटर] = समारोह () {
// बाद के कोड ब्लॉक यहां जाएं ...
}

इसके बाद, आपको उस वस्तु की सभी कुंजियों तक पहुँचने की आवश्यकता होगी जिसे आप चलने योग्य बनाना चाहते हैं। आप कुंजी का उपयोग करके पहुंच सकते हैं वस्तु कुंजी विधि, जो किसी वस्तु के असंख्य गुणों की एक सरणी लौटाती है। की एक सरणी वापस करने के लिए iterObjectकी चाबियाँ, पास करें यह कीवर्ड को तर्क के रूप में वस्तु कुंजी.

उदाहरण के लिए:

होने देना ओब्जप्रॉपर्टीज = वस्तु।चांबियाँ(यह)

इस सरणी तक पहुंच आपको ऑब्जेक्ट के पुनरावृत्ति व्यवहार को परिभाषित करने की अनुमति देगी।

अगला, आपको ऑब्जेक्ट के पुनरावृत्तियों का ट्रैक रखने की आवश्यकता है। आप काउंटर वेरिएबल्स का उपयोग करके इसे प्राप्त कर सकते हैं।

उदाहरण के लिए:

होने देना प्रॉपर्टी इंडेक्स = 0;
होने देना चाइल्डइंडेक्स = 0;

आप ऑब्जेक्ट गुणों का ट्रैक रखने के लिए पहले काउंटर वेरिएबल का उपयोग करेंगे और संपत्ति के बच्चों का ट्रैक रखने के लिए दूसरा उपयोग करेंगे।

इसके बाद, आपको इसे लागू करने और वापस करने की आवश्यकता होगी अगला तरीका।

जैसे इतना:

वापस करना {
अगला() {
// बाद के कोड ब्लॉक यहां जाएं ...
}
}

के अंदर अगला विधि, आपको एक किनारे के मामले को संभालने की आवश्यकता होगी जो तब होता है जब संपूर्ण वस्तु को पुनरावृत्त किया जाता है। किनारे के मामले को संभालने के लिए, आपको एक वस्तु को वापस करना होगा कीमत करने के लिए सेट अपरिभाषित और पूर्ण करने के लिए सेट सत्य.

यदि इस मामले को संभाला नहीं जाता है, तो वस्तु पर पुनरावृति करने की कोशिश करने से अनंत लूप बन जाएगा।

एज केस को हैंडल करने का तरीका यहां दिया गया है:

अगर (संपत्ति सूचकांक > objProperties।लंबाई- 1) {
वापस करना {
कीमत: अपरिभाषित,
पूर्ण: सत्य,
};
}

इसके बाद, आपको पहले घोषित किए गए काउंटर वेरिएबल्स का उपयोग करके ऑब्जेक्ट गुणों और उनके बाल तत्वों तक पहुंचने की आवश्यकता होगी।

जैसे इतना:

// माता-पिता और बच्चे के गुणों तक पहुँचना
कॉन्स्ट गुण = यह[objProperties [PropertyIndex]];

कॉन्स्ट संपत्ति = गुण [चाइल्डइंडेक्स];

अगला, आपको काउंटर चर बढ़ाने के लिए कुछ तर्क लागू करने की आवश्यकता है। तर्क को रीसेट करना चाहिए चाइल्डइंडेक्स जब किसी प्रॉपर्टी के एरे में और तत्व मौजूद नहीं होते हैं और ऑब्जेक्ट में अगली प्रॉपर्टी पर चले जाते हैं। साथ ही इसे बढ़ाना चाहिए चाइल्डइंडेक्स, यदि वर्तमान संपत्ति के सरणी में अभी भी तत्व हैं।

उदाहरण के लिए:

// इंडेक्स इंक्रीमेंट लॉजिक
अगर (चाइल्डइंडेक्स> = गुण। लम्बाई - 1) {
// यदि चाइल्ड एरे में कोई और तत्व नहीं हैं
// रीसेटबच्चाअनुक्रमणिका
चाइल्डइंडेक्स = 0;

// अगली संपत्ति पर जाएं
प्रॉपर्टी इंडेक्स ++;
} अन्य {
// चाइल्ड ऐरे में अगले एलिमेंट पर जाएं
चाइल्डइंडेक्स ++
}

अंत में, के साथ एक वस्तु वापस करें पूर्ण संपत्ति पर सेट असत्य और यह कीमत संपत्ति पुनरावृत्ति में वर्तमान बाल तत्व पर सेट है।

उदाहरण के लिए:

वापस करना {
पूर्ण: असत्य,
मूल्य: संपत्ति,
};

आपका पूरा हुआ प्रतीक.इटरेटर फ़ंक्शन नीचे दिए गए कोड ब्लॉक के समान होना चाहिए:

iterObject [प्रतीकइटरेटर] = समारोह () {
कॉन्स्ट ओब्जप्रॉपर्टीज = वस्तु।चांबियाँ(यह);
होने देना प्रॉपर्टी इंडेक्स = 0;
होने देना चाइल्डइंडेक्स = 0;

वापस करना {
अगला: () => {
// एज केस को हैंडल करना
अगर (संपत्ति सूचकांक > objProperties।लंबाई- 1) {
वापस करना {
कीमत: अपरिभाषित,
पूर्ण: सत्य,
};
}

// माता-पिता और बच्चे के गुणों तक पहुँचना
कॉन्स्ट गुण = यह[objProperties [PropertyIndex]];

कॉन्स्ट संपत्ति = गुण [चाइल्डइंडेक्स];

// इंडेक्स इंक्रीमेंट लॉजिक
अगर (चाइल्डइंडेक्स> = गुण। लम्बाई - 1) {
// यदि चाइल्ड एरे में कोई और तत्व नहीं हैं
// रीसेटबच्चाअनुक्रमणिका
चाइल्डइंडेक्स = 0;

// अगली संपत्ति पर जाएं
प्रॉपर्टी इंडेक्स ++;
} अन्य {
// चाइल्ड ऐरे में अगले एलिमेंट पर जाएं
चाइल्डइंडेक्स ++
}

वापस करना {
पूर्ण: असत्य,
मूल्य: संपत्ति,
};
},
};
};

चल रहा है ए के लिए लूप ऑन iterObject इस कार्यान्वयन के बाद कोई त्रुटि नहीं होगी क्योंकि यह एक लागू करता है प्रतीक.इटरेटर तरीका।

मैन्युअल रूप से पुनरावृत्तियों को लागू करना, जैसा कि हमने ऊपर किया था, अनुशंसित नहीं है क्योंकि यह बहुत त्रुटि-प्रवण है, और तर्क को प्रबंधित करना कठिन हो सकता है।

जावास्क्रिप्ट जेनरेटर

एक जावास्क्रिप्ट जनरेटर एक ऐसा कार्य है जिसे आप किसी भी समय रोक सकते हैं और इसके निष्पादन को फिर से शुरू कर सकते हैं। यह व्यवहार इसे समय के साथ मूल्यों का अनुक्रम उत्पन्न करने की अनुमति देता है।

एक जनरेटर फ़ंक्शन, जो एक ऐसा फ़ंक्शन है जो जेनरेटर देता है, इटरेटर बनाने के लिए एक विकल्प प्रदान करता है।

आप उसी तरह एक जनरेटर फ़ंक्शन बना सकते हैं जिस तरह आप जावास्क्रिप्ट में एक फ़ंक्शन डिक्लेरेशन बनाते हैं। केवल अंतर यह है कि आपको एक तारक चिह्न जोड़ना होगा (*) फ़ंक्शन कीवर्ड के लिए।

उदाहरण के लिए:

समारोह* उदाहरण () {
वापस करना"जनरेटर"
}

जब आप जावास्क्रिप्ट में एक सामान्य फ़ंक्शन को कॉल करते हैं, तो यह इसके द्वारा निर्दिष्ट मान लौटाता है वापस करना कीवर्ड या अपरिभाषित अन्यथा। लेकिन एक जनरेटर फ़ंक्शन तुरंत कोई मान वापस नहीं करता है। यह एक जेनरेटर ऑब्जेक्ट लौटाता है, जिसे आप एक वेरिएबल को असाइन कर सकते हैं।

इटरेटर के वर्तमान मूल्य तक पहुँचने के लिए, कॉल करें अगला जेनरेटर ऑब्जेक्ट पर विधि।

उदाहरण के लिए:

कॉन्स्ट जीन = उदाहरण ();

कंसोल.लॉग (gen.next ()); // { कीमत: 'जेनरेटर', पूर्ण: सत्य }

उपरोक्त उदाहरण में, कीमत संपत्ति ए से आई है वापस करना कीवर्ड, जनरेटर को प्रभावी ढंग से समाप्त कर रहा है। यह व्यवहार आम तौर पर जनरेटर कार्यों के साथ अवांछनीय है, क्योंकि जो उन्हें सामान्य कार्यों से अलग करता है वह निष्पादन को रोकने और पुनः आरंभ करने की क्षमता है।

उपज कीवर्ड

उपज कीवर्ड जेनरेटर फ़ंक्शन के निष्पादन को रोककर और इसके बाद के मान को वापस करके जेनरेटर में मानों के माध्यम से पुनरावृति करने का एक तरीका प्रदान करता है।

उदाहरण के लिए:

समारोह* उदाहरण() {
उपज"मॉडल"
उपज"मॉडल एक्स"
उपज"साइबर ट्रक"

वापस करना"टेस्ला"
}

कॉन्स्ट जीन = उदाहरण ();

कंसोल.लॉग (gen.next ()); // { कीमत: 'मॉडल', पूर्ण: असत्य }

उपरोक्त उदाहरण में, जब अगला विधि पर कॉल किया जाता है उदाहरण जनरेटर, यह हर बार इसका सामना करने पर रुक जाएगा उपज कीवर्ड। पूर्ण संपत्ति पर भी सेट किया जाएगा असत्य जब तक यह एक का सामना नहीं करता वापस करना कीवर्ड।

कॉल कर रहा है अगला विधि पर कई बार उदाहरण जनरेटर इसे प्रदर्शित करने के लिए, आपके पास अपने आउटपुट के रूप में निम्नलिखित होंगे।

कंसोल.लॉग (gen.next ()); // { कीमत: 'मॉडल एक्स', पूर्ण: असत्य }
कंसोल.लॉग (gen.next ()); // { कीमत: 'साइबर ट्रक', पूर्ण: असत्य }
कंसोल.लॉग (gen.next ()); // { कीमत: 'टेस्ला', पूर्ण: सत्य }

सांत्वना देनालॉग (gen.next ()); // {मूल्य: अपरिभाषित, पूर्ण: सच}

आप का उपयोग कर जेनरेटर ऑब्जेक्ट पर भी पुनरावृति कर सकते हैं के लिए कुंडली।

उदाहरण के लिए:

के लिए (कॉन्स्ट इटरेटर का जनरल) {
सांत्वना देनालॉग (इटरेटर);
}

/*
मॉडल
मॉडल एक्स
साइबर ट्रक
*/

इटरेटर और जेनरेटर का उपयोग करना

हालांकि पुनरावर्तक और जेनरेटर अमूर्त अवधारणाओं की तरह प्रतीत हो सकते हैं, लेकिन वे नहीं हैं। अनंत डेटा स्ट्रीम और डेटा संग्रह के साथ काम करते समय वे मददगार हो सकते हैं। आप उनका उपयोग विशिष्ट पहचानकर्ता बनाने के लिए भी कर सकते हैं। MobX-State-Tree (MST) जैसे राज्य प्रबंधन पुस्तकालय भी हुड के तहत उनका उपयोग करते हैं।