2012-09-28 17 views
5

Rozważmy kod poniżej:Problem z JavaScript dla pętli

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

Powyższa funkcja zadaniem jest usunięcie wszystkich elementów z tablicy "arrayElements". Ale tak nie będzie.

Silnik JavaScript zachowuje numer "index" i nie ma nic przeciwko modyfikacji tablicy. Ludzie mogą się spodziewać czegoś podobnego "for each" pętli, które nie mają tego rodzaju kwestii

nawet następujący kod nie wydają się działać:

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

nawet przy zmianie wartości „wskaźnika” zmiennej wydaje się nie działać. zmieniona wartość jest dostępna wewnątrz bloku "for (...) {...}", ale gdy pętla osiągnie kolejną iterację, wartość zostanie zresetowana i będzie kontynuowana od następnego indeksu jako mechanizm zegarowy.

więc wydaje kod jak to może być jedynym rozwiązaniem:

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

Testowane: Firefox 16 Beta.

Ale umieszczenie operatorem, wewnątrz metody "splice()" wydaje się być mylące na pierwszy rzut oka.

To może być warte rozważenia dla "W3C" lub kogo to dotyczy, aby znaleźć dobre rozwiązanie.

+0

Możliwy duplikat http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays –

Odpowiedz

2

Możesz odwołać się do 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 Ten kawałek kodu wygląda ładnie. Ale modyfikowanie obiektu Array "out of the Box" nie brzmi jak dobry pomysł. i BTW fragment kodu nie jest przyjazny dla użytkownika od pierwszego wejrzenia. Facet, który to zakodował, mógł ostrożnie zrobić to, że musi być w tym naprawdę dobry ... – Nokia808Freak

+0

@CrystalPaladin link daje przykład, w którym prototyp nie jest używany. –

0

Spróbuj:

* Istota zmienia oryginalny układ, stąd TGE pętli pomija alternatywne wartości. *

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

Brak wartości alternatywnych po prostu pomija stopniowo. Pomija jedną dla pierwszej iteracji, a drugą dla drugiej, nie uwzględniając pierwszej, którą już pominął. i tak dalej ... – Nokia808Freak

+0

Nie kładę nacisku na opróżnianie tablicy! Spodziewałem się, że widzowie mogą pomyśleć o możliwym rozwiązaniu/objaśnieniu zachowania JavaScript w takim scenariuszu. – Nokia808Freak

+0

Jeśli zobaczysz dokument splice - http://www.w3schools.com/jsref/jsref_splice.asp, to jest wyraźnie napisane, że 'To metoda zmienia oryginalną tablicę. "Pozwól mi stworzyć dla ciebie skrzypce, które, mam nadzieję, sprawią, że wszystko będzie jasne. Wezmę to za jakiś czas. –