2012-09-28 51 views
5

Considere el siguiente código:Problema con Javascript bucle For

function splicer() 
{ 
var arrayElements = ["elem1","elem2","elem3","elem4"]; 
for(var index in arrayElements) 
{ 
    arrayElements.splice(index,1); 
} 
alert("Elements: "+arrayElements); 
} 

La función anterior se supone que eliminar todos los elementos de la matriz "arrayElements". Pero no lo hará.

El motor de Javascript mantiene el "index" tal como está y no le molesta la matriz que se está modificando. gente podría esperar algo así como "for each" bucle que no tiene este tipo de problema

aunque no parece el código siguiente a la obra:

function splicer() 
{ 
... 
for(var index in arrayElements) 
{ 
    arrayElements.splice(index--,1); 
} 
... 
} 

incluso cuando se cambia el valor del "índice" variables no parece funcionar el valor modificado está disponible dentro del bloque "for (...) {...}" pero, a medida que el ciclo alcanza la siguiente iteración, el valor se restablece y continúa desde el siguiente índice como un mecanismo de relojería.

por lo que parece un código como este podría ser la única solución:

function splicer() 
{ 
var arrayElements = ["elem1","elem2","elem3","elem4"]; 
for(var index=0;index<arrayElements.length;index++) 
{ 
    arrayElements.splice(index--,1); 
} 
alert("Elements: "+arrayElements); 
} 

Probado en: Firefox 16 Beta.

Pero la colocación de un operador unitario dentro de un método "splice()" parece ser engañosa a primera vista.

Esto podría valer la pena considerar el "W3C" o quien corresponda para que se les ocurra una buena solución.

+0

duplicado Posible de http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays –

Respuesta

2

Es posible que desee consultar John Resig 's array.remove()link.

// Array Remove - By John Resig (MIT Licensed) 
Array.prototype.remove = function(from, to) { 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
}; 
+0

D Este trozo de código es agradable. Pero modificar el objeto de matriz "fuera de la caja" no parece una buena idea. y por cierto, el fragmento de código no es fácil de usar a primera vista. El tipo que codificó esto podría haber hecho esto cuidadosamente, debe ser realmente bueno en eso ... – Nokia808Freak

+0

@ CrystalPaladin el enlace le proporciona un ejemplo donde no se usa el prototipo. –

0

Prueba esto:

* Splice modifica la matriz original, por lo tanto tge bucle se salta los valores alternativos. *

var arrayElements = ["elem1","elem2","elem3","elem4"]; 
arrayElements.splice(0,arrayElements.length); 
alert("Elements: "+arrayElements) 
+0

No valores alternativos, simplemente se salta progresivamente. omite uno para la primera iteración y dos para el segundo, sin incluir el primero que ya se saltó. y así sucesivamente ... – Nokia808Freak

+0

¡No estoy enfatizando en vaciar una matriz! Esperaba que los espectadores pensaran en una posible solución/explicación del comportamiento de JavaScript en tal escenario – Nokia808Freak

+0

Si ve los documentos de empalme - http://www.w3schools.com/jsref/jsref_splice.asp, está escrito claramente que 'This El método cambia la matriz original. "Déjame crear un violín para ti que, con un poco de suerte, aclarará las cosas". Lo publicaré en algún momento. –