2012-01-01 11 views
7
for (var name in ['dog','cat','cow']) { 
    alert(name); 
} 

El name aquí está devolviendo el índice de la matriz, pero no puedo referirme a él ya que es anónimo.¿es posible hacer referencia a una matriz anónima en un bucle for?

Sé que puedo declararlo fuera del ciclo, pero aquí estoy preguntando si hay alguna manera de referirme al nombre directamente sin índice.

+11

Si se pudiera hacer referencia a la matriz, entonces no sería anónima más ... –

+0

No lo creo. – clyfe

+0

Algunos lenguajes de scripting proporcionan una variable mágica (perl tiene $ _) que da acceso a miembros que de otro modo serían anónimos; Creo que es en eso en lo que rsk82 pudo estar pensando. –

Respuesta

5

Si conoce las claves de la matriz van a ser enteros, no hay nada que hace necesario el uso del constructo for..in.

for (var arr = ['dog','cat','cow'], name = 0; name < arr.length; name++) { 
    console.log(arr[ name ]); 
} 

En el código anterior, un simple for bucle permite la creación de un nuevo objeto y de referencia con llave dentro del bucle.

+2

'arr ++', ¿en serio? Además, usando 'nombre' para el índice de matriz - ** mala ** elección, en mi humilde opinión. –

+0

Se corrigió el error arr antes de publicar. El nombre var se basó en su código existente. El nombre var '' name' es * not * una palabra reservada aunque se usa en algunas implementaciones no estándar (Function.name). Deberías bajar la competitividad. Es mejor ser útil que rápido o elegante. – buley

+4

Quiero decir, cuando veo un 'nombre', espero que sea una cadena, no un número entero. –

3

Si la matriz es anónima, no puede hacer referencia a sus elementos mediante un bucle for in.

13

... no. No hay, al menos, un bucle nativo. Hay, sin embargo, de forEach ES5:

['dog', 'cat', 'cow'].forEach(function(value, key) { 
    // do stuff 
}); 

que es prácticamente el mismo. Es compatible con mostly everywhere, excepto en el antiguo IE: algo así como es5-shim, por ejemplo, habilita los métodos ES5 incluso en navegadores tan antiguos.

+0

A partir de 2015, los navegadores Firefox, Chrome y Webkit admiten este método. No sé sobre IE ya que no tengo Windows para probar. – lepe

+0

IE lo soporta desde IE9 en adelante, por lo que básicamente son todas las versiones que la mayoría de la gente querría admitir. http://caniuse.com/#feat=es5 –

1

Está utilizando una construcción de sintaxis incorrecta para esto.

for in es para enumerar las propiedades del objeto, no para iterar las matrices. Declare su matriz afuera y use el bucle regular.

var arr = ['dog', 'cat', 'cow']; 
for(var i = 0; i < arr.length; i++) { 
    // your code 
} 
3

No, no puedes hacerlo. Mostrará solo los índices. Además, para el bucle de matriz en JavaScript es una mala práctica. Recorrerá todo el método de objetos de matriz.

4

Tiene varias opciones.

Si está utilizando jQuery se puede hacer esto:

$.each(['dog','cat','cow'], function() { 
    var name = this; 
    alert(this); 
}); 

Si no está utilizando jQuery puede crear su propia función

function each(array, pFunction) { 
    for(var i = 0; i < array.length; i++) { 
     var element = array[i]; 
     pFunction(element); 
    } 
} 

each(['dog','cat','cow'], function(name) { 
    alert(name); 
}); 

Si no desea crear una función siempre puedes hacer algo loco como este: (no lo recomiendo)

for (var name in { 'dog' : '','cat' : null,'cow' : null }) { 
    alert(name); 
} 
+0

Probablemente vale la pena señalar que la última opción ya no es una matriz, sino un hash con formato JSON en el que ' re iterando las teclas. Inteligente, si no necesariamente obvio a primera vista (como usted ha dicho, no recomendado;^D). – ruffin

2

Métodos de matriz forEach, map, filter y así sucesivamente va a iterar a través de los índices de una matriz literal:

['dog', 'cat', 'cow'].forEach(alert); 

Cuña para navegadores antiguos:

if(![].forEach){ 
    array.prototype.forEach= function(fun, scope){ 
     var T= this, L= T.length, i= 0; 
     if(typeof fun== 'function'){ 
      while(i< L){ 
       if(i in T){ 
        fun.call(scope, T[i], i, T); 
       } 
       ++i; 
      } 
     } 
     return T; 
    } 
} 
Cuestiones relacionadas