2012-05-13 20 views
9

que tienen una matriz dispersa (índices no son consecutivos) como esto:Javascript iteración a través de matriz dispersa

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" }; 

Quisiera simplemente para recorrer cada elemento, hacer algunas cosas, y ser capaz de romperse bajo una cierta condición.

Soy bastante nuevo en Javascript y no he encontrado una forma adecuada de hacerlo. Esto es lo que probé:

  1. Built-in "for..in". Parece que esto es not the correct way to iterate through an array

  2. forEach de ECMASCRIPT5. Éste itera correctamente, pero no puedo romper el ciclo.

  3. _.each() de Underscore.js. Mismo resultado que el # 2.

  4. $.each() de JQuery. Con este puedo romper devolviendo falso, pero no se repetirá correctamente. Para el ejemplo anterior, en lugar de iterar en 0, 5, 10, 15, se repetirá en 0,1,2,3,4,5,6 ... que obviamente no es lo que espero.

Así que mi pregunta es: ¿Hay una manera fácil de repetir una matriz escasa, con la posibilidad de romper durante el bucle en Javascript o sería mejor utilizar otra estructura de datos como una tabla hash? Si es así, ¿alguna recomendación?

Gracias!

+1

Si mira a través del enlace que proporcionó en el punto n. ° 1, el bucle for..in integrado ES la forma de recorrer las propiedades de un objeto, que es lo que tiene – anson

+0

Por lo que entendí del enlace fue que un problema podría ocurrir si una biblioteca agrega un miembro al Array.prototype. Entonces el miembro será parte del ciclo "for..in". – Absolom

+0

Ah, vale, mi ejemplo no era válido porque estaba usando un objeto y no una matriz. Entonces tu comentario es correcto. – Absolom

Respuesta

6

¿Qué pasa con la sintaxis for...in? Se tiene un objeto lo que la sintaxis for...in es completamente válido utilizar:

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" }; 

for (var key in testArray) { 
    var value = testArray[key]; 

    if (...) { 
    break; 
    } 
} 
+0

Gracias por la respuesta. ¿Pero si quisiera usar una matriz real en lugar de un objeto? ¿Qué usarías entonces? – Absolom

+0

@Absolom JS Arrays hereda de Object, por lo que todavía funcionará bien. – mikemaccana

+3

¿Tiene por qué orden de garantía? –

1

for..in no es lo peor que cuando se trabaja en un hash objeto. Es que hay que evitar para su uso con matrices ([]), pero debe estar bien aquí:

var val; 
for (index in testArray) { 
    if (index == 10) { 
    break; 
    } else { 
    val = testArray[index]; 
    } 
} 
2

Lo primero que tienes que besar-adiós es "Matriz". No existe un verdadero Array en ECMAscript (olvidando las matrices tipadas y el engaño binario).

Así que lo que tienes allí es un simple Object. Para iterar sobre eso, sugiero usar .forEach si está satisfecho con ES5. Si usted necesita para romper principios de esa iteración, es posible que desee utilizar métodos ES5 como .some() o .every(), como:

Object.keys(testArray).some(function(key) { 
    if(+key < 15) {    
     return true; 
    } 

    console.log(key, testArray[key]); 
}); 

Esto Interrumpir la iteración cuando se encuentra una llave que valor numérico no es inferior a 15, por devolviendo true.

0

Lo que tienes no es una matriz, es solo un objeto.

Puede probar por:

Array.isArray(testArray) 

Por lo que vale la pena, JavaScript tiene variedad que se dice que es escasa.Esto sucede cuando usa el operador delete para eliminar un elemento o cambiar la propiedad de longitud a más grande.

Para responder a su pregunta, para recorrer un objeto, la mejor manera es Object.keys(obj).forEach().

var o = {"a":3, "b":4}; 

Object.keys(o).forEach(
    function (key) { 
     var val = o[key]; 
     console.log("Key:" + key); 
     console.log("Value:" + val); 
    } 
); 

La posible problema con for (var p in o) {…} es que será también de bucle a través de propiedades enumerables de la matriz (es decir, la cadena de prototipo). Por lo general, no sucederá si define el objeto por la expresión literal var obj = {...}, que de forma predeterminada su elemento primario es Object.prototype y no tiene ninguna propiedad enumerable.

Cuestiones relacionadas