क्या आप एक जावास्क्रिप्ट लाइब्रेरी जानते हैं जो संग्रह के लिए जेनेरिक इटरेटर क्लास (चाहे वह Arrays या कुछ अमूर्त संख्यात्मक हो) हो, Google Common या Apache Commons जैसी सुविधाओं के पूर्ण सेट के साथ?जावास्क्रिप्ट इटरेटर कक्षा
संपादित करें: Enumerable#each
एक इटरेटर वर्ग नहीं है। मैं एक इटरेटर के लिए देख रहा हूँ, कुछ ऐसा है जो हमें की तरह कुछ लिखने करते हैं:
var iterator = new Iterator(myCollection);
for (var element = iterator.next(); iterator.hasNext(); element = iterator.next()) {
// iterator
}
संपादित करें: Mamoo Mozilla's Javascript 1.7 में इटरेटर कार्यान्वयन की हमें याद दिलाया। तो लक्ष्य अब जावास्क्रिप्ट 1.5 (ईसीएमए 4) में इस इटरेटर फ़ंक्शन के कार्यान्वयन को ढूंढना है।
संपादित 2: लाइब्रेरीज़ (और ईसीएमए 5) each
विधि प्रदान करते समय एक इटरेटर का उपयोग क्यों करें? सबसे पहले, क्योंकि each
आमतौर पर this
के साथ गड़बड़ करता है क्योंकि कॉलबैक call
-ed है (यही कारण है कि each
प्रोटोटाइप में दूसरा तर्क स्वीकार करता है)। फिर, क्योंकि .each(callback)
निर्माण (कम से कम, मेरे क्षेत्र में) के मुकाबले लोग for(;;)
निर्माण से अधिक परिचित हैं। आखिरकार, क्योंकि एक इटरेटर सादे ऑब्जेक्ट्स पर फिर से सक्रिय हो सकता है (जावास्क्रिप्ट 1.7 देखें)।
Edit3: मैं npup के anwser स्वीकार किए जाते हैं, लेकिन यहाँ यह मेरी शॉट है:
function Iterator(o, keysOnly) {
if (!(this instanceof arguments.callee))
return new arguments.callee(o, keysOnly);
var index = 0, keys = [];
if (!o || typeof o != "object") return;
if ('splice' in o && 'join' in o) {
while(keys.length < o.length) keys.push(keys.length);
} else {
for (p in o) if (o.hasOwnProperty(p)) keys.push(p);
}
this.next = function next() {
if (index < keys.length) {
var key = keys[index++];
return keysOnly ? key : [key, o[key]];
} else throw { name: "StopIteration" };
};
this.hasNext = function hasNext() {
return index < keys.length;
};
}
var lang = { name: 'JavaScript', birthYear: 1995 };
var it = Iterator(lang);
while (it.hasNext()) {
alert(it.next());
}
//alert(it.next()); // A StopIteration exception is thrown
var langs = ['JavaScript', 'Python', 'C++'];
var it = Iterator(langs);
while (it.hasNext()) {
alert(it.next());
}
//alert(it.next()); // A StopIteration exception is thrown
ज़रूर, यही कारण है कि हम 15 साल के इंतजार कर रहे थे यह भाषा में शामिल करने के लिए है। – Alsciende
@stereofrog, कई पुस्तकालयों और स्क्रिप्ट्स आजकल एसिंक्रोनस फ़ंक्शन कॉल का उपयोग करते हैं (ठीक है, जब तक वेबवर्कर्स आम तौर पर समर्थित नहीं होते हैं, लेकिन तब भी) और इस समय, आप एक सरल के साथ डेटा को अतुल्यकालिक रूप से (गैर-अवरुद्ध तरीके से) के माध्यम से फिर से कैसे मानते हैं .each() फ़ंक्शन या "इन इन" कथन? Iterators सबसे अच्छा समाधान हैं; वे आसानी से पुन: शुरू करने के लिए एसिंक्रोनस कार्यों के माध्यम से पारित किया जा सकता है और अंडरलेइंग कार्यान्वयन के बावजूद। (यह सब के बाद इटेटरेटर पैटर्न है)। जावास्क्रिप्ट न केवल एक कार्यात्मक भाषा है ... लेकिन यहां तक कि कार्यात्मक भाषा * करते हैं * iterators ... –
संपादन 2 में, जब आपने ES5 की 'प्रत्येक' विधि का उल्लेख किया था, तो क्या आपका मतलब '.forEach() 'विधि था? – dcorking