Знаете ли вы библиотеку JavaScript, которая реализует общий класс Iterator для коллекций (будь то массивы или некоторые абстрактные Enumerable) с полным набором функций, таких как Google Общие или Apache Commons?
Изменить: Enumerable#each
не является классом Iterator. Я ищу Итератор, что-то, что позволило бы нам написать что-то вроде:
var iterator = new Iterator(myCollection);
for (var element = iterator.next(); iterator.hasNext(); element = iterator.next()) {
// iterator
}
Изменить: mamoo напомнил нам о реализации Iterator в Mozilla Javascript 1.7. Итак, теперь задача состоит в том, чтобы найти реализацию этой функции Iterator в Javascript 1.5 (ECMA 4).
Edit2: Почему использование итератора, когда библиотеки (и ECMA 5) предоставляют метод each
? Во-первых, поскольку each
обычно беспорядок с this
, потому что обратный вызов call
-ed (что почему each
принимает второй аргумент в Prototype). Тогда, потому что люди гораздо лучше знакомы с конструкцией for(;;)
, чем с конструкцией .each(callback)
(по крайней мере, в моем поле). Наконец, поскольку итератор может перебирать простые объекты (см. JavaScript 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