2012-09-28 12 views
5

Si consideri il codice qui sotto:Problema con JavaScript ciclo For

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

La funzione di cui sopra dovrebbe rimuovere tutti gli elementi dell'array "arrayElements". Ma non lo farà.

Il motore di Javascript mantiene lo "index" così com'è e non fa attenzione all'array che si sta modificando. La gente potrebbe aspettarsi qualcosa di simile "for each" ciclo che non ha questo tipo di problema

anche il seguente codice non sembra funzionare:

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

anche quando si cambia il valore dell ' "indice" variabile non sembra funzionare. il valore modificato è disponibile all'interno del blocco "per (...) {...}" ma, poiché il ciclo raggiunge l'iterazione successiva, il valore viene ripristinato e continua dall'indice successivo come un orologio.

così sembra codice come questo potrebbe essere l'unica soluzione:

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

Testato: Firefox 16 Beta.

Ma mettendo un operatore unario all'interno di un metodo "splice()" sembra essere fuorviante a prima vista.

Questo potrebbe valere la pena considerare il "W3C" o chiunque possa riguardare in modo che escano con una soluzione piacevole.

+0

Eventuali duplicati di http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays –

risposta

2

Si consiglia di fare riferimento a 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 Questo pezzo di codice è bello. Ma modificare l'oggetto array "out of the box" non sembra una buona idea. e BTW lo snippet di codice non è facile da usare a prima vista. Il tizio che ha codificato questo potrebbe averlo fatto con attenzione, deve essere davvero bravo in questo ... – Nokia808Freak

+0

@CrystalPaladin il link ti fornisce un esempio in cui il prototipo non viene utilizzato. –

0

Prova questo:

* Splice modifica dell'array originale, quindi tge ciclo salta i valori alternativi. *

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

Nessun valore alternativo salta progressivamente. salta uno per la prima iterazione e due per la seconda senza includere il primo che ha già saltato. e così via ... – Nokia808Freak

+0

Non sto sottolineando di svuotare un array! Mi aspettavo che gli spettatori potessero pensare a una possibile soluzione/spiegazione del comportamento di JavaScript in tale scenario – Nokia808Freak

+0

Se vedi i documenti di splicing - http://www.w3schools.com/jsref/jsref_splice.asp, è scritto chiaramente che 'Questo il metodo cambia l'array originale. Lasciami creare un violino per te che, si spera, chiarisca le cose. Lo posterò tra qualche tempo. –