在javascript中编码迭代器的最佳方法

时间:2009-10-15 10:51:38

标签: javascript iterator

我正在Javascript中构建一个复杂的对象,我想在对象的内部集合上公开迭代器。

我能想到的唯一方法是在prototype.js中公开迭代器的常用方法:

customObject.each(function (item) { ... })

所提供的函数由迭代器每个为集合中的每个项目调用,一个接一个。

你知道其他任何可靠的方法吗?也许这种方式可以让用户使用通常的 foreach 构造?

2 个答案:

答案 0 :(得分:6)

原型样式函数是一个不错的选择,不过您也可以考虑以下内容:

overlayRegistry = function() {
var overlays = [];
var index = 0;


return {
    addOverlay : function(overlay) {
            overlays.push(overlay);
    count : function() {
        return overlays.length;
    },
    reset : function() {
        index = 0;
    },
    next : function() {
        if (index < overlays.length) {
            return overlays[index++];
        } else {
            return null;
                    }
    },
    each : function (callback) {
        for (var index = 0, length = overlays.length; index < length; ++index) {
             callback(overlays[index]);
        }
    }

}
}();

在这种情况下,您可以在等待其他事件时逐步迭代它(如此结构背后的情况)

基本上,提供像each这样的方法可以很好地工作,如果你只需要简单的迭代,但如果你需要更多的控制,那么上面的东西就可以了(当然,你可以做到这两点)

修改
添加了每种方法

答案 1 :(得分:1)

您应该使用for in代替。

>>> var customObject = {x: 1, y:2}
>>> for (a in customObject) console.log(a, customObject[a])
x 1
y 2

但请记住继承的属性。

>>>Object.prototype.yarrr = function yarrr(){ console.warn('YARRR!') }
>>> for (a in customObject) console.log(a, customObject[a])
x 1
y 2
yarrr()
>>> for (a in customObject) if (customObject.hasOwnProperty(a)) console.log(customObject[a])
x 1
y 2