Frage Wie lege ich ein Array in JavaScript leer?


Gibt es eine Möglichkeit, ein Array zu leeren und wenn möglich mit .remove()?

Zum Beispiel,

A = [1,2,3,4];

Wie kann ich das leeren?


2199
2017-08-05 09:08


Ursprung


Antworten:


Möglichkeiten, ein bestehendes Array zu löschen A:

Methode 1

(Dies war meine ursprüngliche Antwort auf die Frage)

A = [];

Dieser Code wird die Variable festlegen A zu einem neuen leeren Array. Dies ist perfekt, wenn Sie nicht haben Verweise auf das ursprüngliche Array A irgendwo anders, weil dies tatsächlich ein brandneues (leeres) Array erzeugt. Sie sollten mit dieser Methode vorsichtig sein, denn wenn Sie dieses Array von einer anderen Variablen oder Eigenschaft referenziert haben, bleibt das ursprüngliche Array unverändert. Verwenden Sie dies nur, wenn Sie das Array nur anhand seiner Originalvariablen referenzieren A.

Dies ist auch die schnellste Lösung.

Dieses Codebeispiel zeigt das Problem, das bei der Verwendung dieser Methode auftreten kann:

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

Methode 2 (wie empfohlen durch Matthew Crumley)

A.length = 0

Dadurch wird das vorhandene Array gelöscht, indem seine Länge auf 0 festgelegt wird. Einige haben argumentiert, dass dies möglicherweise nicht bei allen Implementierungen von JavaScript funktioniert, aber es stellt sich heraus, dass dies nicht der Fall ist. Es funktioniert auch, wenn in ECMAScript 5 "strict mode" verwendet wird, da die length-Eigenschaft eines Arrays eine Lese- / Schreibeigenschaft ist.

Methode 3 (wie empfohlen durch Anthony)

A.splice(0,A.length)

Verwenden .splice() wird perfekt funktionieren, aber seit dem .splice() Funktion wird ein Array mit allen entfernten Elementen zurückgeben, es wird tatsächlich eine Kopie des ursprünglichen Arrays zurückgeben. Benchmarks deuten darauf hin, dass dies keinerlei Auswirkungen auf die Performance hat.

Methode 4 (wie empfohlen durch tanguy_k)

while(A.length > 0) {
    A.pop();
}

Diese Lösung ist nicht sehr prägnant und im Gegensatz zu früheren Benchmarks, auf die in der ursprünglichen Antwort verwiesen wird, auch die langsamste Lösung.

Performance

Von allen Methoden, ein existierendes Array, Methoden 2 und 3 sind sehr ähnlich in der Leistung und sind viel schneller als Methode 4. Siehe dies Benchmark.

Wie von Diadistis in ihren Antworten Im Folgenden 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 die zweite Iteration ein Array löschte, das bereits leer war.

Der folgende Benchmark behebt diesen Fehler: http://jsben.ch/#/hyj65. Es zeigt deutlich, dass Methoden # 2 (Längeneigenschaft) und # 3 (Spleiß) die schnellsten sind (Methode # 1 wird nicht gezählt, die das ursprüngliche Array nicht ändert).


Dies war ein heißes Thema und die Ursache für viele Kontroversen. Es gibt tatsächlich viele richtige Antworten und da diese Antwort für eine sehr lange Zeit als die akzeptierte Antwort markiert wurde, werde ich hier alle Methoden einschließen. Wenn Sie für diese Antwort stimmen, nehmen Sie bitte die anderen Antworten auf, auf die ich ebenfalls verwiesen habe.


3440
2017-08-05 09:10



Wenn Sie das ursprüngliche Array behalten möchten, weil Sie weitere Verweise darauf haben, die ebenfalls aktualisiert werden sollen, können Sie es löschen, ohne ein neues Array zu erstellen, indem Sie seine Länge auf Null setzen:

A.length = 0;

2253
2017-08-05 16:29



Hier die schnellste Arbeitsimplementierung während das gleiche Array behalten ("veränderlich"):

Array.prototype.clear = function() {
  while (this.length) {
    this.pop();
  }
};

FYI Karte definiert clear() so scheint es logisch zu haben clear() zum Array auch.

Oder als Underscore.js mischen:

_.mixin({
  clearArray: function(array) {
    while (array.length) {
      array.pop();
    }
  }
});

Oder eine einfache Funktion:

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

Typoskript Ausführung:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

Zu Ihrer Information kann es nicht vereinfacht werden while (array.pop()): Die Tests werden fehlschlagen.

Und die Tests, die damit einhergehen:

describe('Array', () => {
  it('should clear the array', () => {
    let array = [1, 2, 3, 4, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);

    // Even with undefined or null inside
    array = [1, undefined, 3, null, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

Hier der aktualisierte jsPerf: http://jsperf.com/array-destroy/32  http://jsperf.com/array-destroy/152


255
2018-06-25 20:32



Eine browserfreundlichere und optimalere Lösung wird es sein, die splice Methode, um den Inhalt des Arrays A wie folgt zu leeren:

A.splice(0, A.length);


182
2017-11-15 09:49



Die Antworten, die nicht weniger als 2739 upvotes haben, sind irreführend und inkorrekt.

Die Frage ist: "Wie entleerst du dein bestehendes Array?" Z.B. zum A = [1,2,3,4].

  1. Sprichwort "A = [] ist die Antwort "ist ignorant und absolut falsch. [] == [] ist falsch.

    Dies liegt daran, dass diese beiden Arrays zwei getrennte, individuelle Objekte mit jeweils zwei Identitäten sind, die jeweils ihren eigenen Platz in der digitalen Welt einnehmen.


Nehmen wir an, deine Mutter bittet dich, den Mülleimer zu leeren.

  • Du bringst keinen neuen rein, als hättest du getan, wonach du gefragt wurdest.
  • Stattdessen leeren Sie den Mülleimer.
  • Sie ersetzen das Gefüllte nicht durch eine neue leere Dose, und Sie nehmen nicht das Etikett "A" aus der gefüllten Dose und kleben es auf das Neue wie in A = [1,2,3,4]; A = [];

Das Leeren eines Array-Objekts ist das einfachste überhaupt:

A.length = 0;

So ist die Dose unter "A" nicht nur leer, sondern auch so sauber wie neu!


  1. Außerdem müssen Sie den Müll nicht von Hand entfernen, bis die Dose leer ist! Du wurdest aufgefordert, den bestehenden zu leeren, und zwar vollständig, in einer Runde, um den Müll nicht aufzuheben, bis die Dose leer ist, wie in:

    while(A.length > 0) {
        A.pop();
    }
    
  2. Auch nicht, um Ihre linke Hand auf den Boden des Papierkorbs zu legen, halten Sie sie mit der rechten nach oben, um den Inhalt herausziehen zu können wie in:

    A.splice(0, A.length);
    

Nein, Sie wurden gebeten, es zu leeren:

A.length = 0;

Dies ist der einzige Code, der den Inhalt eines bestimmten JavaScript-Arrays korrekt leert.


61
2018-04-30 15:18



Leistungstest:

http://jsperf.com/array-clear-methods/3

a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length)  // 97% slower
while (a.length > 0) {
    a.pop();
} // Fastest

59
2018-05-14 07:14



Sie können dies Ihrer JavaScript-Datei hinzufügen, damit Ihre Arrays "gelöscht" werden können:

Array.prototype.clear = function() {
    this.splice(0, this.length);
};

Dann kannst du es so benutzen:

var list = [1, 2, 3];
list.clear();

Oder wenn du sicher sein willst, dass du etwas nicht zerstörst:

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}

Viele Leute denken, Sie sollten native Objekte (wie Array) nicht ändern, und ich bin geneigt zuzustimmen. Bitte seien Sie vorsichtig bei der Entscheidung, wie Sie damit umgehen.


32
2017-12-11 02:58