【发布时间】:2011-02-08 08:28:54
【问题描述】:
你知道一个 JavaScript 库,它为集合(无论是数组还是一些抽象的 Enumerable)实现了一个通用的迭代器类,它具有完整的功能集,例如 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 中的迭代器实现。所以现在的目标是在 Javascript 1.5 (ECMA 4) 中找到这个 Iterator 函数的实现。
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
【问题讨论】:
-
当然,这就是为什么我们等了 15 年才将它包含在语言中。
-
@stereofrog,现在许多库和脚本都使用异步函数调用(好吧,直到 WebWorkers 得到普遍支持,但即便如此),目前,您如何看待异步迭代数据(在非-阻塞方式)使用简单的 .each() 函数或“for in”语句?迭代器是最好的解决方案;它们可以通过异步函数传递以轻松恢复迭代,而不管底层实现如何。 (毕竟这是迭代器模式)。 Javascript 不仅是一种函数式语言……甚至函数式语言确实有迭代器……
-
在编辑2中,当您提到ES5的
each方法时,您是指.forEach()方法吗?
标签: javascript iterator