Was ist der Unterschied zwischen der Verwendung des delete
Operators für das Array-Element und der Verwendung der Array.splice
Methode ?
Zum Beispiel:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
Warum überhaupt die Spleißmethode, wenn ich Array-Elemente wie mit Objekten löschen kann?
javascript
arrays
array-splice
delete-operator
lYriCAlsSH
quelle
quelle
.splice
Schauen Sie sich für In-Schleifen diese Frage an: Aus Array in Javascript löschen .delete
undArray.prototype.splice
.Antworten:
delete
löscht die Objekteigenschaft, indiziert das Array jedoch nicht neu und aktualisiert seine Länge nicht. Dies lässt es so aussehen, als ob es undefiniert ist:Beachten Sie, dass es nicht auf den Wert festgelegt ist
undefined
, sondern dass die Eigenschaft aus dem Array entfernt wird, sodass sie undefiniert erscheint . Die Chrome-Entwicklungstools machen diese Unterscheidung durch Druckenempty
beim Protokollieren des Arrays deutlich.myArray.splice(start, deleteCount)
Entfernt das Element tatsächlich, indiziert das Array neu und ändert seine Länge.quelle
delete
funktioniert das Element entfernen, aber nicht indiziert das Array nicht oder aktualisieren , seine Länge (die bereits von den ehemaligen impliziert wird , da die Länge ist immer der höchste Index + 1).delete myArray[0]
Syntax mit der Aufschrift " Erwartete einen Operator und sah stattdessen" Löschen ". " Die Verwendungsplice
wird empfohlen.delete myArray[0]
undmyArray[0] = undefined
. Im ersteren Fall wird die Eigenschaft vollständig aus dem Array-Objekt entfernt. Im zweiten Fall bleibt die Eigenschaft mit dem Wert erhaltenundefined
.empty
anstattundefined
die Unterscheidung zwischen einem tatsächlich gelöschten (oder nicht initialisierten) Array-Element und einem Element mit dem tatsächlichen Wert von zu verbessernundefined
. Beachten Sie, dass ich damit meine, dass es nur als angezeigtempty
wird und sich nicht auf einen reellen Wert bezieht, der aufgerufen wirdempty
(der nicht existiert).Array.remove () -Methode
John Resig , Schöpfer von jQuery, hat eine sehr praktische
Array.remove
Methode entwickelt, die ich in meinen Projekten immer verwende.und hier sind einige Beispiele, wie es verwendet werden könnte:
Johns Website
quelle
[1,2,3].slice('1'); // =[2,3]
), daher ist es sicherer, sie invar rest = this.slice(parseInt(to || from) + 1 || this.length);
this.push.apply(this, rest)
und gibt dann den zurückgegebenen Wert zurückfor(var i in array)
Zyklus durchlaufen wird. Ich habe es entfernt und stattdessen Spleiß verwendet.Da beim Löschen nur das Objekt aus dem Element im Array entfernt wird, ä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.
Während dies "a", "b", "d" anzeigt.
quelle
myArray.splice(2,1)
Ich bin auf diese Frage gestoßen, als ich versucht habe zu verstehen, wie jedes Vorkommen eines Elements aus einem Array entfernt werden kann. Hier ist ein Vergleich von
splice
unddelete
zum Entfernen aller Elemente'c'
aus demitems
Array.quelle
In Core JavaScript 1.5 Referenz> Operatoren> Spezielle Operatoren> Operator löschen :
quelle
splice
funktioniert mit numerischen Indizes.während
delete
gegen andere Art von Indizes verwendet werden ..Beispiel:
quelle
Erwähnenswert ist wahrscheinlich auch, dass Splice nur auf Arrays funktioniert. (Auf Objekteigenschaften kann nicht vertraut werden, um einer konsistenten Reihenfolge zu folgen.)
Um das Schlüssel-Wert-Paar aus einem Objekt zu entfernen, ist Löschen genau das, was Sie wollen:
quelle
Vs Splice löschen
wenn Sie ein Element aus einem Array löschen
wenn Sie spleißen
Beim Löschen wird das Element gelöscht , der Index bleibt jedoch leer
Im Falle eines Spleißelements wird der Index der Ruheelemente entsprechend reduziert
quelle
Wie bereits mehrfach erwähnt,
splice()
scheint die Verwendung perfekt zu passen. Dokumentation bei Mozilla:quelle
Löschen verhält sich wie eine nicht reale Situation, es entfernt nur das Element, aber die Array-Länge bleibt gleich:
Beispiel vom Knotenterminal:
Hier ist eine Funktion zum Entfernen eines Elements eines Arrays nach Index mithilfe von Slice (). Dabei wird arr als erstes Argument und der Index des Elements, das Sie löschen möchten, als zweites Argument verwendet. Wie Sie sehen können, wird das Mitglied des Arrays tatsächlich gelöscht und die Array-Länge um 1 verringert
Die obige Funktion führt alle Mitglieder zum Index und alle Mitglieder nach dem Index, verkettet sie und gibt das Ergebnis zurück.
Hier ist ein Beispiel, in dem die obige Funktion als Knotenmodul verwendet wird. Es ist hilfreich, das Terminal zu sehen:
Bitte beachten Sie, dass dies nicht für ein Array mit Dupes funktioniert, da indexOf ("c") nur das erste Vorkommen erhält und nur das erste gefundene "c" herausspleißt und entfernt.
quelle
Wenn Sie ein großes Array iterieren und Elemente selektiv löschen möchten, ist es teuer, splice () für jedes Löschen aufzurufen, da splice () nachfolgende Elemente jedes Mal neu indizieren müsste. Da Arrays in Javascript assoziativ sind, wäre es effizienter, die einzelnen Elemente zu löschen und das Array anschließend neu zu indizieren.
Sie können dies tun, indem Sie ein neues Array erstellen. z.B
Ich glaube jedoch nicht, dass Sie die Schlüsselwerte im ursprünglichen Array ändern können, was effizienter wäre - es sieht so aus, als müssten Sie möglicherweise ein neues Array erstellen.
Beachten Sie, dass Sie nicht nach "undefinierten" Einträgen suchen müssen, da diese nicht vorhanden sind und die for-Schleife sie nicht zurückgibt. Es ist ein Artefakt des Array-Drucks, das sie als undefiniert anzeigt. Sie scheinen nicht im Gedächtnis zu existieren.
Es wäre schön, wenn Sie so etwas wie Slice () verwenden könnten, das schneller wäre, aber nicht neu indiziert. Kennt jemand einen besseren Weg?
Tatsächlich können Sie dies wahrscheinlich wie folgt tun, was in Bezug auf die Leistung wahrscheinlich effizienter ist:
quelle
Sie können so etwas verwenden
quelle
slice
wenn Sie aus einem funktionalen Hintergrund stammen (wahrscheinlich jedoch weniger effizient).Warum nicht einfach filtern? Ich denke, es ist der klarste Weg, die Arrays in js zu betrachten.
quelle
delete
oderslice
für mich.Der Unterschied kann durch Protokollieren der Länge jedes Arrays nach Anwendung des
delete
Operators und dersplice()
Methode festgestellt werden . Zum Beispiel:Operator löschen
Der
delete
Operator entfernt das Element aus dem Array, aber der "Platzhalter" des Elements ist noch vorhanden.oak
wurde entfernt, benötigt aber noch Platz im Array. Aus diesem Grund bleibt die Länge des Arrays 5.splice () Methode
Die
splice()
Methode entfernt den Zielwert und den "Platzhalter" ebenfalls vollständig .oak
wurde entfernt sowie der Platz, den es im Array belegt hat. Die Länge des Arrays beträgt jetzt 4.quelle
Beispiel:
Banane wird gelöscht und Array-Länge = 2
quelle
Es sind verschiedene Dinge, die unterschiedliche Zwecke haben.
splice
ist Array-spezifisch und entfernt beim Löschen Einträge aus dem Array und verschiebt alle vorherigen Einträge nach oben, um die Lücke zu füllen. (Es kann auch verwendet werden, um Einträge oder beides gleichzeitig einzufügen.)splice
Ändertlength
das Array (vorausgesetzt, es handelt sich nicht um einen No-Op-Aufruf :)theArray.splice(x, 0)
.delete
ist nicht Array-spezifisch; Es wurde für die Verwendung in Objekten entwickelt: Es entfernt eine Eigenschaft (Schlüssel / Wert-Paar) aus dem Objekt, für das Sie es verwenden. Dies gilt nur für Arrays, da Standard-Arrays (z. B. nicht typisierte Arrays) in JavaScript überhaupt keine Arrays sind *, sondern Objekte mit besonderer Behandlung für bestimmte Eigenschaften, z. B. solche, deren Namen "Array-Indizes" sind definiert als Stringnamen "... deren numerischer Werti
im Bereich liegt+0 ≤ i < 2^32-1
") undlength
. Wenn Siedelete
einen Array-Eintrag entfernen, wird lediglich der Eintrag entfernt. Es werden keine weiteren Einträge verschoben, um die Lücke zu füllen, und so wird das Array "spärlich" (einige Einträge fehlen vollständig). Es hat keine Auswirkung auflength
.In einigen aktuellen Antworten auf diese Frage wird fälschlicherweise angegeben, dass mit
delete
"den Eintrag aufundefined
" gesetzt wird. Das stimmt nicht Es entfernt den Eintrag (die Eigenschaft) vollständig und hinterlässt eine Lücke.Verwenden wir einen Code, um die Unterschiede zu veranschaulichen:
* (das ist ein Beitrag in meinem anämischen kleinen Blog)
quelle
Derzeit gibt es zwei Möglichkeiten, dies zu tun
mit splice ()
arrayObject.splice(index, 1);
mit löschen
delete arrayObject[index];
Ich empfehle jedoch immer, Spleiß für Array-Objekte und Löschen für Objektattribute zu verwenden, da durch Löschen die Array-Länge nicht aktualisiert wird.
quelle
OK, stellen Sie sich vor, wir haben dieses Array unten:
Lassen Sie uns zuerst löschen:
und das ist das Ergebnis:
leeren! und lass es uns bekommen:
Bedeutet also, dass nur der Wert gelöscht wurde und jetzt undefiniert ist. Die Länge ist also gleich und es wird auch true zurückgegeben ...
Lassen Sie uns unser Array zurücksetzen und diesmal mit Spleiß ausführen:
und diesmal ist das Ergebnis:
Wie Sie sehen, hat sich die Array-Länge geändert und
arr[1]
beträgt jetzt 3 ...Dies gibt auch das gelöschte Element in einem Array zurück, das
[3]
in diesem Fall ...quelle
Andere haben bereits richtig verglichen
delete
mitsplice
.Ein weiterer interessanter Vergleich ist
delete
versusundefined
: Ein gelöschtes Array-Element benötigt weniger Speicher als eines, das gerade eingestellt istundefined
.Dieser Code wird beispielsweise nicht beendet:
Es erzeugt diesen Fehler:
Wie Sie sehen,
undefined
nimmt der Heap-Speicher also tatsächlich Platz.Wenn Sie jedoch auch
delete
das ary-Element verwenden (anstatt es nur auf zu setzenundefined
), wird der Code langsam beendet:Dies sind extreme Beispiele, aber sie weisen darauf hin,
delete
dass ich nirgendwo jemanden erwähnt habe.quelle
Wenn Sie ein kleines Array haben, können Sie Folgendes verwenden
filter
:quelle
Der einfachste Weg ist wahrscheinlich
Hoffe das hilft. Referenz: https://lodash.com/docs#compact
quelle
compact
... keine Notwendigkeit für Lodash. Versuchen SiemyArray.filter(function(n){return n;})
Für diejenigen, die Lodash verwenden möchten, können Sie verwenden:
myArray = _.without(myArray, itemToRemove)
Oder wie ich es in Angular2 benutze
quelle
Element vom letzten löschen
Element zuerst löschen
Aus der Mitte löschen
Löschen Sie ein Element vom letzten
Löschen Sie mit der Array-Indexnummer
quelle
Wenn sich das gewünschte zu löschende Element in der Mitte befindet (sagen wir, wir möchten 'c' löschen, dessen Index 1 ist), können Sie Folgendes verwenden:
quelle
IndexOf
akzeptiert auch einen Referenztyp. Angenommen, das folgende Szenario:Anders:
quelle
// Ergebnis: myArray = ['b', 'c', 'd'];
quelle