我正在Javascript中构建一个复杂的对象,我想在对象的内部集合上公开迭代器。
我能想到的唯一方法是在prototype.js中公开迭代器的常用方法:
customObject.each(function (item) { ... })
所提供的函数由迭代器每个为集合中的每个项目调用,一个接一个。
你知道其他任何可靠的方法吗?也许这种方式可以让用户使用通常的 foreach 构造?
答案 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