2009-10-15 71 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

相關問題