2009-10-15 42 views
5

我在Javascript中构建了一个复杂对象,我想通过该对象的内部集合公开一个迭代器。在javascript中对代码迭代器的最佳方式

我能想到的唯一的办法就是在prototype.js中暴露的迭代器的常用方法:

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

与所提供的功能迭代器每个为集合中的每一项被称为一之后。

你知道其他可靠的方法吗?也许一种方式,会让用户使用通常的foreach构造?

回答

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

您应该改用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
+2

是啊,但是你要确保customObject.hasOwnProperty(一)为每个方法/属性返回true。否则,你可能会结束继承的东西。 – dylanfm 2009-10-15 11:05:55

+0

考虑到它是一个复杂的对象,我只能假定它有'for..in'也会迭代的方法。 – 2009-10-15 11:06:00

+5

如果我正确地理解了这个问题,他的自定义对象有一个内部集合,他想提供一种方法来遍历内部集合中的元素,而不是自定义对象的属性 – 2009-10-15 11:12:53

相关问题