2009-10-15 12 views
5

Estoy creando un objeto complejo en Javascript y quiero exponer un iterador sobre una colección interna del objeto.La mejor manera de codificar el iterador en javascript

La única manera que se me ocurre es la forma habitual de exponer iteradores en prototype.js:

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

con la función prevista de ser llamado por el iterador cada uno para cada elemento de la colección, una después del otro

¿Conoces alguna otra manera confiable? ¿Tal vez una forma que permita a los usuarios usar la construcción foreach habitual?

Respuesta

6

La función de estilo prototipo es una buena opción, aunque también podría considerar algo como:

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]); 
     } 
    } 

} 
}(); 

En este caso, se puede iterar sobre ella en los pasos mientras espera para otros eventos (como se fue el caso detrás de esta estructura)

Básicamente, proporcionar un método como each puede funcionar muy bien si todo lo que necesita es simple iteración, pero si necesita más control, entonces algo como lo anterior funcionaría (por supuesto, podría hacerlo ambos)

Editar
Agregado cada método

1

En su lugar, debe usar for in.

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

Pero recuerde acerca de las propiedades heredadas.

>>>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

Sí, pero usted querrá asegurarse de que customObject.hasOwnProperty (a) devuelve verdadero para cada método/propiedad. De lo contrario, podrías terminar con cosas heredadas. – dylanfm

+0

Considerando que es un objeto complejo, solo puedo suponer que tiene métodos que 'for..in' repetirán también. –

+5

Si entendí la pregunta correctamente, su objeto personalizado tiene una colección interna y quiere proporcionar una forma de iterar sobre los elementos en la colección interna, no las propiedades del objeto personalizado –

Cuestiones relacionadas