Was ist der effizientere Weg, um ein Array in ein anderes Array einzufügen?
a1 = [1,2,3,4,5];
a2 = [21,22];
newArray - a1.insertAt(2,a2) -> [1,2, 21,22, 3,4,5];
Das Iterieren von a2 mithilfe von Spleiß sieht aus Sicht der Leistung etwas schrecklich aus, wenn das a2-Array groß ist.
Vielen Dank.
Antworten:
Sie können
splice
mit einigenapply
Tricks kombiniert verwenden :In ES2015 + können Sie stattdessen den Spread-Operator verwenden, um dies ein bisschen angenehmer zu gestalten
quelle
apply
wird eine Stackoverflow-Ausnahme ausgelöst. jsfiddle.net/DcHCY Kommt auch in jsPerf vor Ich glaube an FF und IE, der Schwellenwert liegt bei 500ktarget.slice(0, insertIndex).concat(insertArr, target.slice(insertIndex));
ArraygrößenSie können dies jetzt tun, wenn Sie ES2015 oder höher verwenden:
In diesem Dokument finden Sie Informationen zum Spread-Operator (...) https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator
quelle
Hatte es zuerst falsch. Hätte
concat()
stattdessen verwenden sollen.Beispiel: http://jsfiddle.net/f3cae/1/
Dieser Ausdruck verwendet
slice(0, 2)
[docs] , um die ersten beiden Elemente von zurückzugebena1
(wobei der Startindex0
und2
das Element deleteCount sind, jedocha1
nicht geändert werden).Zwischenergebnis :
[1,2]
Anschließend werden mit
concat(a2)
[docs]a2
an das Ende des angehängt[1,2]
.Zwischenergebnis :
[1,2,21,22]
.Als nächstes
a1.slice(2)
wird innerhalb eines Trailing.concat()
am hinteren Ende dieses Ausdrucks aufgerufen , was gleichbedeutend ist[1,2,21,22].concat(a1.slice(2))
.Ein Aufruf von
slice(2)
mit einem positiven Ganzzahlargument gibt alle Elemente nach dem 2. Element zurück und zählt nach natürlichen Zahlen (wie in gibt es fünf Elemente,[3,4,5]
wird also von zurückgegebena1
). Eine andere Möglichkeit, dies zu sagen, besteht darin, dass das singuläre Ganzzahlindexargument angibt,a1.slice()
an welcher Position im Array Elemente zurückgegeben werden sollen (Index 2 ist das dritte Element).Zwischenergebnis :
[1,2,21,22].concat([3,4,5])
Schließlich
.concat()
fügt der zweite[3,4,5]
das Ende von hinzu[1,2,21,22]
.Ergebnis :
[1,2,21,22,3,4,5]
Es mag verlockend sein, Änderungen vorzunehmen
Array.prototype
, aber Sie können das Array-Objekt einfach mithilfe der prototypischen Vererbung erweitern und das neue Objekt in Ihre Projekte einfügen.Für diejenigen, die am Rande leben ...
Beispiel: http://jsfiddle.net/f3cae/2/
quelle
Mit dem Spread- Operator kann ein Ausdruck an Stellen erweitert werden, an denen mehrere Argumente (für Funktionsaufrufe) oder mehrere Elemente (für Array-Literale) erwartet werden.
quelle
Hier gibt es einige wirklich kreative Antworten auf diese Frage. Hier ist eine einfache Lösung für diejenigen, die gerade erst mit Arrays beginnen. Auf Wunsch kann es bis zu ECMAScript 3-kompatiblen Browsern verwendet werden.
Wissen Sie etwas über Spleißen, bevor Sie beginnen.
Mozilla Developer Network: Array.prototype.splice ()
Verstehen Sie zunächst zwei wichtige Formen von
.splice()
.Methode 1) Entfernen Sie x (deleteCount) -Elemente ausgehend von einem gewünschten Index.
Methode 2) Entfernen Sie Elemente nach einem gewünschten Startindex bis zum Ende des Arrays.
Mit Hilfe
.splice()
könnte ein Ziel zu spalten seina1
oben , indem Sie eine der beiden Formen in Kopf und Schwanz - Arrays.Bei Verwendung der Methode 1 wird der Rückgabewert zum Kopf und
a1
zum Schwanz.Verketten Sie nun auf einen Schlag Kopf, Körper (
a2
) und SchwanzSomit ähnelt diese Lösung mehr der realen Welt als jede andere, die bisher vorgestellt wurde. Würden Sie das nicht mit Legos machen? ;-) Hier ist eine Funktion, die mit Methode 2 durchgeführt wurde.
Kürzere:
Sicherer:
Die Vorteile dieser Lösung umfassen:
1) Eine einfache Prämisse dominiert die Lösung - füllen Sie ein leeres Array.
2) Die Nomenklatur von Kopf, Körper und Schwanz fühlt sich natürlich an.
3) Kein doppelter Anruf bei
.slice()
. Überhaupt kein Schneiden.4) Nein
.apply()
. Sehr unnötig.5) Methodenverkettung wird vermieden.
6) Funktioniert in ECMAScript 3 und 5 einfach mit oder
var
anstelle vonlet
oderconst
.** 7) Stellt sicher, dass im Gegensatz zu vielen anderen vorgestellten Lösungen Kopf und Schwanz auf den Körper geschlagen werden können. Wenn Sie ein Array vor oder nach den Grenzen hinzufügen, sollten Sie zumindest
.concat()
!!!!Hinweis: Die Verwendung des Spread-Opearators
...
erleichtert dies erheblich.quelle
Ich wollte einen Weg finden, dies zu tun
splice()
und nicht zu iterieren: http://jsfiddle.net/jfriend00/W9n27/ .Im Allgemeinen Funktionsform:
quelle
a2
Array, was wahrscheinlich ziemlich unerwünscht ist. Außerdem müssen Sie nicht zu gehen,Array.prototype
wenn Sie die Slice-Funktion direkt aufa1
oder habena2
.apply()
Methode hinzugefügt wurde .Array.prototype.splice
vsa1.splice
:).concat
Gibt ein neues Array zurück, es ändert das vorhandene nicht wiesplice
. Sollte seinargs = args.concat(arrayToInsert);
quelle
Hier ist meine Version ohne besondere Tricks:
quelle
.apply()
.Wenn Sie ein anderes Array in ein Array einfügen möchten, ohne ein neues zu erstellen, ist es am einfachsten, entweder
push
oderunshift
mit zu verwendenapply
Z.B:
Dies funktioniert, weil beide
push
undunshift
eine variable Anzahl von Argumenten annehmen. Als Bonus können Sie ganz einfach auswählen, an welchem Ende das Array angebracht werden soll!quelle
a1.concat(a2)
alsa2.concat(a1)
ich es vorschlage. Das Problem besteht jedoch darin, ein Array zwischen Array-Grenzen einzufügen und nicht ausschließlich ein Array am Anfang oder Ende hinzuzufügen. ;-)Wie in einem anderen Thread erwähnt, funktionieren die obigen Antworten in sehr großen Arrays (200K-Elemente) nicht. Siehe alternative Antwort hier mit Spleiß und manuellem Push: https://stackoverflow.com/a/41465578/1038326
quelle