1451 Stimmen

Löschen von Array-Elementen in JavaScript - Löschen vs. Spleißen

Was ist der Unterschied zwischen der Verwendung von die delete Betreiber auf das Array-Element im Gegensatz zur Verwendung von die Array.splice Methode ?

Zum Beispiel:

myArray = ['a', 'b', 'c', 'd'];

delete myArray[1];
//  or
myArray.splice (1, 1);

Warum überhaupt die Splice-Methode, wenn ich Array-Elemente löschen kann, wie ich mit Objekten kann?

4 Stimmen

Para .splice in Schleifen, werfen Sie einen Blick auf diese Frage: Löschen aus Array in Javascript .

6 Stimmen

@andynormancx Ja, aber diese Antwort wurde erst einen Tag später gepostet und erhielt so viele Stimmen - ich würde sagen, sie ist besser geschrieben, das muss es sein.

0 Stimmen

@andynormancx - Es scheint kein exaktes Duplikat zu sein. Die Frage, die Sie verlinkt haben, fragt im Grunde, warum das Löschen eines Elements aus einem Array (wodurch es spärlich wird) dessen Länge nicht verringert. Diese Frage fragt nach den Unterschieden zwischen delete y Array.prototype.splice .

1820voto

Andy Hume Punkte 38284

delete löscht die Objekteigenschaft, indiziert das Array aber nicht neu und aktualisiert auch nicht dessen Länge. Dies lässt es so erscheinen, als ob es undefiniert wäre:

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> delete myArray[0]
  true
> myArray[0]
  undefined

Beachten Sie, dass der Wert nicht auf den Wert undefined sondern die Eigenschaft wird aus dem Array entfernt, wodurch sie erscheinen undefiniert. Die Chrome-Entwicklungstools machen diesen Unterschied deutlich, indem sie Folgendes ausgeben empty bei der Protokollierung des Arrays.

> myArray[0]
  undefined
> myArray
  [empty, "b", "c", "d"]

myArray.splice(start, deleteCount) entfernt das Element tatsächlich, indiziert das Array neu und ändert seine Länge.

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> myArray.splice(0, 2)
  ["a", "b"]
> myArray
  ["c", "d"]

84 Stimmen

Eigentlich, delete tut entfernt das Element, indiziert das Array jedoch nicht neu und aktualisiert auch nicht seine Länge (was bereits durch die erste Option impliziert wird, da die Länge immer der höchste Index+1 ist).

3 Stimmen

JSlint mag nicht delete myArray[0] Syntax: " Erwartete einen Operator und sah stattdessen 'löschen'. " Verwendung von splice wird empfohlen.

30 Stimmen

@Eye: Eigentlich beschwert sich JSLint nur über das Fehlen eines Semikolons in der vorherigen Zeile. Und man kann nicht wirklich das eine dem anderen vorziehen, da sie völlig unterschiedliche Dinge tun

352voto

Mohsen Punkte 61518

Array.remove() Methode

John Resig Der Schöpfer von jQuery hat ein sehr praktisches Array.remove Methode, die ich bei meinen Projekten immer verwende.

// 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);
};

und hier sind einige Beispiele, wie es verwendet werden könnte:

// Remove the second item from the array
array.remove(1);
// Remove the second-to-last item from the array
array.remove(-2);
// Remove the second and third items from the array
array.remove(1,2);
// Remove the last and second-to-last items from the array
array.remove(-2,-1);

Johns Website

5 Stimmen

+1 Für Array.remove(). Es ist jedoch nicht glücklich, wenn ihm String-Argumente übergeben werden (im Gegensatz zu den meisten Array-Methoden, z.B. [1,2,3].slice('1'); // =[2,3] ), so dass es sicherer ist, ihn zu ändern in var rest = this.slice(parseInt(to || from) + 1 || this.length);

0 Stimmen

Ich stellte fest, dass dies ein asynchrones Problem verursachte. Wird der Thread vor this.push.apply() aufgegeben?

1 Stimmen

@tomwrong, es gibt keine Threads in Javascript, und die Funktion wird ausgeführt this.push.apply(this, rest) und gibt dann den Wert zurück, den es zurückgegeben hat

109voto

andynormancx Punkte 12861

Da delete nur das Objekt aus dem Element im Array entfernt, ändert sich die Länge des Arrays nicht. Splice entfernt das Objekt und verkürzt das Array.

Der folgende Code zeigt "a", "b", "undefiniert", "d" an

myArray = ['a', 'b', 'c', 'd']; delete myArray[2];

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

Hier hingegen wird "a", "b", "d" angezeigt.

myArray = ['a', 'b', 'c', 'd']; myArray.splice(2,1);

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

12 Stimmen

Die erste 1 bezieht sich auf den Index im Array, mit dem der Spleiß beginnen soll, die zweite 1 ist die Anzahl der zu entfernenden Elemente. Um also 'c' aus dem ursprünglichen Array zu entfernen, verwenden Sie myArray.splice(2,1)

77voto

Troy Harvey Punkte 2293

Ich bin auf diese Frage gestoßen, als ich versuchte zu verstehen, wie man jedes Vorkommen eines Elements aus einem Array entfernen kann. Hier ist ein Vergleich von splice y delete zum Entfernen aller 'c' von der items Array.

var items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  items.splice(items.indexOf('c'), 1);
}

console.log(items); // ["a", "b", "d", "a", "b", "d"]

items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  delete items[items.indexOf('c')];
}

console.log(items); // ["a", "b", undefined, "d", "a", "b", undefined, "d"]

14voto

f3lix Punkte 28602

De Core JavaScript 1.5 Referenz > Operatoren > Spezielle Operatoren > delete-Operator :

Wenn Sie ein Array-Element löschen, wird die Array-Länge nicht beeinflusst. Für Beispiel: Wenn Sie a[3] löschen, ist a[4] immer noch a[4] und a[3] ist undefiniert. Diese gilt auch, wenn Sie das letzte Element des Arrays löschen (delete a[a.length-1]).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X