2011-06-13 11 views
8

Normalmente uso scripts/programas usando Python, pero recientemente comencé a programar con JavaScript y he tenido algunos problemas al trabajar con matrices.JavaScript Array

en Python, cuando se crea una matriz y uso para x en y me sale esto:

myarray = [5,4,3,2,1] 
for x in myarray: 
    print x 

y consigo el resultado esperado de:

5 
4 
3 
..n 

Pero mi problema es que cuando uso Javascript obtengo un resultado diferente y completamente inesperado (para mí):

var world = [5,4,3,2,1] 
for (var num in world) { 
    alert(num); 
} 

y consigo el resultado:

0 
1 
2 
..n 

¿Cómo llego JavaScript para num salida como el valor de la matriz como Python y por qué sucede esto?

+1

duplicado, respondió en detalle aquí: http://stackoverflow.com/questions/3010840/loop-through-array-in-javascript – galambalazs

Respuesta

10

JavaScript y Python son diferentes, y usted hace las cosas de diferentes maneras entre ellos.

En JavaScript, que realmente debe (casi) siempre iterar sobre una matriz con un índice numérico:

for (var i = 0; i < array.length; ++i) 
    alert(array[i]); 

El "de ... en" construir en JavaScript que da las claves del objeto , no los valores . Es difícil de usar en una matriz porque opera en la matriz como un objeto, y no lo trata de manera diferente a cualquier otro tipo de objeto. Por lo tanto, si el objeto de matriz tiene propiedades adicionales —, que es completamente "legal" y no es infrecuente —, su ciclo las seleccionará además de los índices del contenido de matriz "normal".

+3

+ 1, no use 'for..in' en arreglos. – Shurdoof

7

La variable num contiene el índice del elemento de matriz, no el valor. Así que te gustaría:

alert(world[num]) 

para recuperar el valor

6

El de var ... en bucle en JavaScript pone las llaves en la variable en lugar del valor real. Así que cuando se utiliza para var ... deberías hacer algo como esto:

var world = [5, 4, 3, 2, 1]; 
for (var key in world) { 
    var value = world[key]; 
    alert(key + " = " + value); 
} 

Y tenga en cuenta que esta forma de bucle se utiliza mejor cuando se está utilizando objetos en lugar de matrices. Para las matrices utilizan el común:

for (var i = 0, j = arr.length; i < j; i++) { ... } 

O si usted está apuntando navegador moderno puede utilizar el método de forEach-arrays:

var arr = [1, 2, 3]; 
arr.forEach(function(num) { 
    alert(num); 
}); 
+1

+1 por forEach() –

1

bucles El bucle for...in sobre todos los elementos clave; no los valores

Yo recomendaría el uso

for(var i=0; i<arr.length; i++){ 
    alert(arr[i]); 
} 
1

Cuando se utiliza el operador innum se convierte en una clave.Simplemente use esta tecla para obtener un valor de la matriz.

var world = [5,4,3,2,1] 
for (var num in world) { 
    alert(world[num]); 
} 
1

prueba esto.

var world = [5,4,3,2,1] 
for(var i=0;i<world.length;i++){ 
    alert(world[i]) 
} 

Porque javascript en su caso está imprimiendo el índice del elemento, no el valor.

1

el resultado que tienes es el índice solo elemento, si desea obtener valor de elemento

el código debe recibir este

var world = [5,4,3,2,1] 
for (var num in world) { 
    alert(world[num]); 
} 
1

La iteración forin en JavaScript funciona sólo para el tipo de datos object. La forma en que funciona es que le permite iterar sobre el attributes de un objeto. arrays son objects en JavaScript, pero forin solo funciona en sus atributos, no en los valores de la matriz.

Por ejemplo, puede definir una matriz como tal:

var arr = [1,2,3]; 

Y se puede asignar atributos a esta matriz, ya que en realidad es un objeto:

arr.foo = "bar"; 
arr["1"] = 2; 

Ahora, cuando se utiliza el forin método de iteración podrá iterar sobre los atributos que acabamos de asignar;

for(var i in arr) console.log(i); 

para iterar sobre los valores de la matriz real que necesita para utilizar el constructo for(var i=0; i<arr.length; i++).

Espero que esto ayude.

1

En javascript, se recomienda hacer ciclos de Arrays diferentes de los objetos de bucle. Está utilizando un bucle de objeto, que puede devolver resultados inesperados (por ejemplo, si el Array.prototype se extendió con métodos personalizados, también se repetirán esos, y no garantiza que se conserve el orden de la matriz). Hay muchas maneras de bucle a través de una matriz, utilizando su index:

// regular 
var arr = [1,2,3,4,5] 
    ,i 
; 
for (i=0;i<arr.length;i++) { 
    console.log(arr[i]); 
} 

// using while 
var arr = [1,2,3,4,5] 
    ,i = 0 
; 
while ((i = i + 1)<arr.length) { 
    console.log(arr[i]); 
} 

// using while reversed 
var arr = [1,2,3,4,5] 
    ,i = arr.length 
; 
while ((i = i - 1) > -1) { 
    console.log(arr[i]); 
} 

Nota: ¿Por qué no usar i++ o i--? Para evitar confusiones, índice fuera de rango -errors y para satisfacer JSLint