Gibt es eine Möglichkeit, ein Array zu leeren und wenn ja, möglicherweise mit .remove()
?
Zum Beispiel,
A = [1,2,3,4];
Wie kann ich das leeren?
javascript
arrays
akano1
quelle
quelle
Antworten:
Möglichkeiten zum Löschen eines vorhandenen Arrays
A
:Methode 1
(Dies war meine ursprüngliche Antwort auf die Frage)
Dieser Code setzt die Variable
A
auf ein neues leeres Array. Dies ist perfekt, wenn Sie nirgendwo anders Verweise auf das ursprüngliche Array habenA
, da dadurch tatsächlich ein brandneues (leeres) Array erstellt wird. Sie sollten mit dieser Methode vorsichtig sein, da das ursprüngliche Array unverändert bleibt, wenn Sie dieses Array von einer anderen Variablen oder Eigenschaft aus referenziert haben. Verwenden Sie diese Option nur, wenn Sie das Array nur anhand seiner ursprünglichen Variablen referenzierenA
.Dies ist auch die schnellste Lösung.
Dieses Codebeispiel zeigt das Problem, das bei Verwendung dieser Methode auftreten kann:
Methode 2 (wie vorgeschlagen durch Matthew Crumley )
Dadurch wird das vorhandene Array gelöscht, indem seine Länge auf 0 gesetzt wird. Einige haben argumentiert, dass dies möglicherweise nicht in allen Implementierungen von JavaScript funktioniert, es stellt sich jedoch heraus, dass dies nicht der Fall ist. Dies funktioniert auch bei Verwendung des "strengen Modus" in ECMAScript 5, da die Längeneigenschaft eines Arrays eine Lese- / Schreibeigenschaft ist.
Methode 3 (wie vorgeschlagen durch Anthony )
Die Verwendung
.splice()
funktioniert einwandfrei, aber da die.splice()
Funktion ein Array mit allen entfernten Elementen zurückgibt, wird tatsächlich eine Kopie des ursprünglichen Arrays zurückgegeben. Benchmarks legen nahe, dass dies keinerlei Auswirkungen auf die Leistung hat.Methode 4 (wie vorgeschlagen durch tanguy_k )
Diese Lösung ist nicht sehr prägnant und im Gegensatz zu früheren Benchmarks, auf die in der ursprünglichen Antwort verwiesen wurde, auch die langsamste Lösung.
Performance
Von allen Methoden zum Löschen eines vorhandenen Arrays sind die Methoden 2 und 3 in ihrer Leistung sehr ähnlich und viel schneller als Methode 4. Siehe diesen Benchmark .
Wie von Diadistis in ihrer Antwort unten ausgeführt, waren die ursprünglichen Benchmarks, die zur Bestimmung der Leistung der vier oben beschriebenen Methoden verwendet wurden, fehlerhaft. Der ursprüngliche Benchmark verwendete das gelöschte Array erneut, sodass bei der zweiten Iteration ein bereits leeres Array gelöscht wurde.
Der folgende Benchmark behebt diesen Fehler: http://jsben.ch/#/hyj65 . Es zeigt deutlich, dass die Methoden Nr. 2 (Längeneigenschaft) und Nr. 3 (Spleißen) am schnellsten sind (Methode 1 wird nicht gezählt, wodurch das ursprüngliche Array nicht geändert wird).
Dies war ein heißes Thema und hat viele Kontroversen ausgelöst. Es gibt tatsächlich viele richtige Antworten, und da diese Antwort schon sehr lange als akzeptierte Antwort markiert ist, werde ich hier alle Methoden einschließen. Wenn Sie für diese Antwort stimmen, stimmen Sie bitte auch den anderen Antworten zu, auf die ich verwiesen habe.
quelle
while (A.length) { A.pop(); }
, keine Notwendigkeit für> 0
> 0
ist meiner Meinung nach besser lesbar. Und es gibt keinen Leistungsunterschied zwischen den beiden.b
enthält einen Verweis auf das alte Array, auch nachdema
ein neues zugewiesen wurde.c
undd
verweisen Sie weiterhin auf dasselbe Array. Der Unterschied in den Leistungen wird daher erwartet.while(A.pop())
wenn ein Element im Array falsch ist. Nehmen wir zum Beispiel A = [2, 1, 0, -1, -2] würde A gleich [2, 1] ergeben. Auchwhile(A.pop() !== undefined)
funktioniert nicht, weil Sie ein Array mit undefined als einem der Werte haben können. Wahrscheinlich, warum der Compiler es nicht optimiert hat.Wenn Sie das ursprüngliche Array beibehalten müssen, weil Sie andere Verweise darauf haben, die ebenfalls aktualisiert werden sollten, können Sie es löschen, ohne ein neues Array zu erstellen, indem Sie seine Länge auf Null setzen:
quelle
myarray.push(whatever)
, wird die Länge um eins erhöht . Wenn Sie also die Länge festlegen, wird das Array abgeschnitten, aber es ist nicht permanent.length
ist eine spezielle Eigenschaft, aber nicht schreibgeschützt, so dass es weiterhin funktioniert.Hier die am schnellsten funktionierende Implementierungbei gleichem Array ("veränderlich"):Zu Ihrer Information kann es nicht vereinfacht werden
while (array.pop())
: Die Tests werden fehlschlagen.FYI Map und Set definieren
clear()
, es wäre logisch, dies auchclear()
für Array zu haben.TypeScript-Version:
Die entsprechenden Tests:
Hier das aktualisierte jsPerf:
http://jsperf.com/array-destroy/32http://jsperf.com/array-destroy/152quelle
Array.prototype
und etwas anderes getan hat, dann war Ihr gesamter Code[].clear()
etwas falsch. Das Debuggen würde keinen Spaß machen. Die allgemeine Botschaft lautet also: Ändern Sie keine globalen Werte.function clear(arr) { while(arr.length) arr.pop(); }
, dann klar Arrays mitclear(arr)
stattarr.clear()
..splice()
und ist.length=0
. Die Benchmarks waren nicht korrekt. Siehe meine aktualisierte Antwort.Eine browserübergreifendere und optimalere Lösung besteht darin,
splice
den Inhalt des Arrays A wie folgt zu leeren:A.splice(0, A.length);
quelle
splice
ändert das Array und gibt die gelöschten Einträge zurück. Lesen Sie zuerst die Dokumente: developer.mozilla.org/en-US/docs/JavaScript/Reference/…A.splice(0, A.length),0;
. Dies würde einen Rückgabewert von0
genauso hinterlassen wieA.length = 0;
. Das resultierende Array wird noch erstellt und sollte dazu führen, dass das Skript langsamer ausgeführt wird: ( jsperf ~ 56% langsamer). Die Browser-Implementierung wirkt sich darauf aus, obwohl ich keinen Grund sehe, warumsplice
dies schneller als die Einstellung wärelength
.A.splice(0)
auch funktioniert.Die Antworten, die nicht weniger als 2739 positive Stimmen haben, sind irreführend und falsch.
Die Frage ist: "Wie leeren Sie Ihr vorhandenes Array?" ZB für
A = [1,2,3,4]
."Ist
A = []
die Antwort" zu sagen ist unwissend und absolut falsch.[] == []
ist falsch .Dies liegt daran, dass diese beiden Arrays zwei separate, individuelle Objekte mit ihren eigenen zwei Identitäten sind, die ihren eigenen Raum in der digitalen Welt einnehmen, jedes für sich.
Angenommen, deine Mutter bittet dich, den Mülleimer zu leeren.
A = [1,2,3,4]; A = [];
Das Leeren eines Array-Objekts ist die einfachste Sache aller Zeiten:
Auf diese Weise ist die Dose unter "A" nicht nur leer, sondern auch so sauber wie neu!
Außerdem müssen Sie den Müll nicht von Hand entfernen, bis die Dose leer ist! Sie wurden gebeten, den vorhandenen in einer Runde vollständig zu leeren und den Müll nicht aufzuheben, bis die Dose leer ist, wie in:
Um Ihre linke Hand nicht auf den Boden des Papierkorbs zu legen und sie mit der rechten oben zu halten, können Sie den Inhalt wie folgt herausziehen:
Nein, Sie wurden gebeten, es zu leeren:
Dies ist der einzige Code, der den Inhalt eines bestimmten JavaScript-Arrays korrekt leert.
quelle
A(n) = A.splice( 0, A.length );
Fall, dass Sie Ihre vorherigen Inhalte sichern müssen. psArray.length
ist eine Lese- / Schreibeigenschaft \ Methode, falls Sie diese grundlegende Tatsache übersehen haben. Das heißt, Sie können es auf eine neue Länge erweitern, Sie können es nicht auf die gewünschte Länge zuschneiden und unter anderem können Sie alle Mitglieder verwerfen, indem Sie seine Länge auf 0 kürzen. Es ist ein Schweizer Messer des Arrays.Leistungstest:
http://jsperf.com/array-clear-methods/3
quelle
Sie können dies zu Ihrer JavaScript-Datei hinzufügen, damit Ihre Arrays "gelöscht" werden können:
Dann können Sie es so verwenden:
Oder wenn Sie sicher sein wollen, dass Sie nichts zerstören:
Viele Leute denken, Sie sollten native Objekte (wie Array) nicht ändern, und ich bin geneigt, dem zuzustimmen. Bitte entscheiden Sie vorsichtig, wie Sie damit umgehen sollen.
quelle
clear
Schlüssel enthält?Es gibt viel Verwirrung und Fehlinformationen in Bezug auf die Zeit; Pop / Shift-Leistung sowohl in Antworten als auch in Kommentaren. Die while / pop-Lösung weist (wie erwartet) die schlechteste Leistung auf . Was tatsächlich passiert, ist, dass das Setup für jedes Sample, das das Snippet in einer Schleife ausführt, nur einmal ausgeführt wird. z.B:
Ich habe einen neuen Test erstellt, der korrekt funktioniert:
http://jsperf.com/empty-javascript-array-redux
Warnung: Selbst in dieser Version des Tests können Sie den tatsächlichen Unterschied nicht erkennen, da das Klonen des Arrays den größten Teil der Testzeit in Anspruch nimmt. Es zeigt immer noch, dass dies
splice
der schnellste Weg ist, um das Array zu löschen (ohne[]
Berücksichtigung, da es zwar der schnellste ist, aber das vorhandene Array nicht tatsächlich löscht).quelle
Wenn Sie an der Speicherzuweisung interessiert sind, können Sie jeden Ansatz mit so etwas wie jsfiddle in Verbindung mit der Timeline-Registerkarte der Chrome Dev Tools vergleichen. Sie sollten das Papierkorbsymbol unten verwenden, um eine Speicherbereinigung nach dem Löschen des Arrays zu erzwingen. Dies sollte Ihnen eine genauere Antwort für den Browser Ihrer Wahl geben. Viele Antworten hier sind alt und ich würde mich nicht auf sie verlassen, sondern wie in der obigen Antwort von @ tanguy_k testen.
(Eine Einführung in die oben genannte Registerkarte finden Sie hier )
Stackoverflow zwingt mich, die jsfiddle zu kopieren, also hier ist es:
Und Sie sollten beachten, dass dies vom Typ der Array-Elemente abhängen kann, da Javascript Zeichenfolgen anders verwaltet als andere primitive Typen, ganz zu schweigen von Arrays von Objekten. Der Typ kann beeinflussen, was passiert.
quelle
Sie können ganz einfach eine Funktion erstellen, um dies für Sie zu tun, die Länge zu ändern oder sie sogar als Funktion zur Wiederverwendung zum nativen Array hinzuzufügen
remove()
.Stellen Sie sich vor, Sie haben dieses Array:
OK, führen Sie einfach Folgendes aus:
und das Ergebnis ist:
einfache Möglichkeit, ein Array zu leeren ...
Verwenden Sie auch eine Schleife, die nicht erforderlich ist, sondern nur eine andere Möglichkeit, dies zu tun:
Es gibt auch schwierige Wege, über die Sie nachdenken können, zum Beispiel so etwas:
Wenn arr also 5 Elemente enthält, werden 5 Elemente von 0 gespleißt, was bedeutet, dass nichts im Array verbleibt.
Auch andere Möglichkeiten, wie das Array einfach neu zuzuweisen, zum Beispiel:
Wenn Sie sich die Array-Funktionen ansehen, gibt es viele andere Möglichkeiten, dies zu tun, aber die am meisten empfohlene könnte darin bestehen, die Länge zu ändern.
Wie ich bereits sagte, können Sie auch den Prototyp remove () verwenden, da dies die Antwort auf Ihre Frage ist. Sie können einfach eine der oben genannten Methoden auswählen und sie als Prototyp für ein Array-Objekt in JavaScript erstellen.
und Sie können es einfach so nennen, um ein beliebiges Array in Ihrer Javascript-Anwendung zu leeren:
quelle
Und nenne es:
array.clear();
quelle
A.splice(0);
Ich habe das gerade mit einem Code gemacht, an dem ich arbeite. Es löschte das Array.
quelle
Wenn Sie verwenden
Dann weisen Sie a eine neue Array-Referenz zu. Wenn die Referenz in a bereits einer anderen Variablen zugewiesen ist, wird auch dieses Array nicht geleert, und daher sammelt der Garbage Collector diesen Speicher nicht.
Zum Beispiel.
oder
Wenn wir angeben
a.length
, setzen wir nur die Grenzen des Arrays zurück und der Speicher für die restlichen Array-Elemente wird durch den Garbage Collector verbunden.Anstelle dieser beiden Lösungen sind besser.
und
Gemäß der vorherigen Antwort von kenshou.html ist die zweite Methode schneller.
quelle
a.length
, dass ich falsch liege , sehe ich nicht, was diese neue Antwort dem Thread hinzufügt?a.length=0;
? Wie würden diese Motoren füra.length=500;
und wirkena.length=4;
?var a = [1]; var b = a; a.length = 0; console.log(b)
DruckeArray [ ]
, daher scheint es mir nicht so, als würde ein neues Array erstellt.Verwenden Sie eine modifizierte Version von Jan 's ursprünglichem Vorschlag:
quelle
Wenn Sie Konstanten verwenden, haben Sie keine Wahl:
Sie können nicht neu zuweisen:
Sie können nur abschneiden:
quelle
Um einen aktuellen Speicherort eines Arrays zu leeren, verwenden Sie:
'myArray.length = 0'
oder'myArray.pop() UN-till its length is 0'
length
: Sie können die Eigenschaft length so einstellen, dass ein Array jederzeit abgeschnitten wird. Wenn Sie ein Array durch Ändern seiner Längeneigenschaft erweitern, erhöht sich die Anzahl der tatsächlichen Elemente.pop()
: Die Pop-Methode entfernt das letzte Element aus einem Array und gibt den entfernten Wert zurück.shift()
: Die Verschiebungsmethode entfernt das Element am nullten Index und verschiebt die Werte bei aufeinanderfolgenden Indizes nach unten. Anschließend wird der entfernte Wert zurückgegeben.Beispiel:
new Array() | []
Erstellen Sie mitArray constructor
oder ein Array mit neuem Speicherortarray literal
.slice()
: Durch Verwendung der Slice-Funktion erhalten wir eine flache Kopie der Elemente aus dem ursprünglichen Array mit neuer Speicheradresse, sodass Änderungen an cloneArr keine Auswirkungen auf ein tatsächliches | ursprüngliches Array haben.quelle
length = ?
statt nur sagen sollenlength
.Ich bin überrascht, dass dies noch niemand vorgeschlagen hat:
Dies ergibt ein Array in einem ganz anderen Zustand als die anderen Lösungen. In gewisser Weise wurde das Array "geleert":
Sie können ein äquivalentes Array mit
[,,,,]
oder erstellenArray(4)
quelle
Verwenden Sie unten, wenn Sie Angular 2+ FormArray leeren müssen.
quelle