2012-09-28 22 views
5

den Code unten vor:Problem mit Javascript For-Schleife

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

Die obige Funktion soll alle Elemente "arrayElements" aus dem Array entfernen. Aber es wird nicht.

Javascript-Engine behält die "index", wie es ist und nichts dagegen, das Array geändert wird. Menschen könnte so etwas wie "for each" Schleife erwarten, dass diese Art von Problem hat

auch den folgenden Code scheint nicht zu funktionieren:

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

selbst wenn der Wert der Variablen „Index“ zu ändern scheint nicht zu funktionieren. Der geänderte Wert ist innerhalb des "for (...) {...}" Blocks verfügbar, aber wenn die Schleife die nächste Iteration erreicht, wird der Wert zurückgesetzt und läuft vom nächsten Index als Uhrwerk weiter.

so scheint es, Code wie könnte dies die einzige Lösung sein:

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

Geprüft: Firefox 16 Beta.

Aber ein unärer Operator innerhalb einer Methode "splice()" Platzierung scheint auf den ersten Blick irreführend.

Dies könnte eine Überlegung wert sein, die "W3C" oder wen auch immer es angeht, so dass sie mit einer schönen Lösung kommen.

+0

Mögliche Duplikat http://stackoverflow.com/questions/500504/javascript-for-in-with-arrays –

Antwort

2

Sie können sich auf John Resig 's array.remove()link beziehen.

// 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 Dieses Stück Code Sieht gut aus. Aber das "Out of the Box" -Array-Objekt zu modifizieren klingt nicht nach einer guten Idee. und BTW ist das Code-Snippet auf den ersten Blick nicht benutzerfreundlich. Der Typ, der dies codiert hat, könnte dies sorgfältig getan haben, er muss wirklich gut darin sein ... – Nokia808Freak

+0

@CrystalPaladin Der Link liefert ein Beispiel, in dem der Prototyp nicht verwendet wird. –

0

Dies versuchen:

* Splice modifiziert den Original-Array, also TGE Schleife überspringt die abwechselnden Werte. *

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

Nicht alternative Werte, es wird nur progressiv übersprungen. Überspringt einen für die erste Iteration und zwei für die zweite, ohne den ersten, den er bereits übersprungen hat. und so weiter ... – Nokia808Freak

+0

Ich betone nicht, ein Array zu leeren! Ich habe erwartet, dass die Zuschauer an eine mögliche Lösung/Erklärung des JavaScript-Verhaltens in einem solchen Szenario denken könnten. – Nokia808Freak

+0

Wenn Sie die Spleiß-Dokumentation sehen - http://www.w3schools.com/jsref/jsref_splice.asp, wird klar geschrieben, dass dies "This" Methode ändert die ursprüngliche Anordnung. "Lassen Sie mich eine Geige für Sie erstellen, die hoffentlich die Dinge klarstellt. Ich werde es in einer gewissen Zeit veröffentlichen. –