Ich habe ein JavaScript-Array, dataArray
das ich in ein neues Array verschieben möchte newArray
. Außer ich will nicht newArray[0]
sein dataArray
. Ich möchte alle Elemente in das neue Array einfügen:
var newArray = [];
newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...
oder noch besser:
var newArray = new Array (
dataArray1.values(),
dataArray2.values(),
// ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);
Das neue Array enthält nun alle Werte der einzelnen Datenarrays. Gibt es eine Kurzform wie " pushValues
verfügbar", damit ich nicht jedes einzelne durchlaufen dataArray
und die Elemente einzeln hinzufügen muss?
javascript
arrays
bba
quelle
quelle
Antworten:
Verwenden Sie die Concat- Funktion wie folgt :
Der Wert von
newArray
wird[1, 2, 3, 4]
(arrayA
undarrayB
bleibt unverändert;concat
erstellt und gibt ein neues Array für das Ergebnis zurück).quelle
Google Chrome
: schnell (concat = Gewinner) ,Opera
: schnell (concat = Gewinner) ,IE
: langsamer (concat = Gewinner) ,Firefox
: langsam (push.apply = Gewinner, aber 10-mal langsamer als Chrome's concat) ... sprechen von einer schlechten Implementierung der JS-Engine .push
ein Array von Werten nicht abgeflacht wird.concat
erreicht, was die Frage erfordert.Vorausgesetzt, Ihre Arrays sind nicht sehr groß (siehe Einschränkung unten), können Sie die
push()
Methode des Arrays verwenden, an das Sie Werte anhängen möchten.push()
kann mehrere Parameter annehmen, sodass Sie dieapply()
Methode verwenden können, um das zu pushende Array von Werten als Liste von Funktionsparametern zu übergeben. Dies hat den Vorteilconcat()
, dass dem Array Elemente hinzugefügt werden, anstatt ein neues Array zu erstellen.Es scheint jedoch, dass bei großen Arrays (in der Größenordnung von 100.000 Mitgliedern oder mehr) dieser Trick fehlschlagen kann . Für solche Arrays ist die Verwendung einer Schleife ein besserer Ansatz. Weitere Informationen finden Sie unter https://stackoverflow.com/a/17368101/96100 .
Vielleicht möchten Sie dies in eine Funktion verallgemeinern:
... oder zum
Array
Prototyp hinzufügen :... oder das Original emulieren
push()
Verfahren durch mehrere Parameter unter Verwendung der Tatsache ermöglicht , dassconcat()
, wiepush()
, mehrere Parameter erlaubt:Hier ist eine schleifenbasierte Version des letzten Beispiels, die für große Arrays und alle gängigen Browser geeignet ist, einschließlich IE <= 8:
quelle
newArray.push.apply(newArray, dataArray1);
gibt das gleiche wieArray.prototype.push.applay(newArray,dataArra1);
Array.prototype.concat
ist nicht schlecht, sondern wird einfach missverstanden und manchmal missbraucht. Unter diesen Umständen wird es nur missverstanden, aber nicht missbraucht.Ich werde noch eine "zukunftssichere" Antwort hinzufügen
In ECMAScript 6 können Sie die Spread-Syntax verwenden :
Die Spread-Syntax ist noch nicht in allen gängigen Browsern enthalten. Informationen zur aktuellen Kompatibilität finden Sie in dieser (ständig aktualisierten) Kompatibilitätstabelle .
Sie können jedoch die Spread-Syntax mit Babel.js verwenden .
bearbeiten:
Weitere Kommentare zur Leistung finden Sie in der Antwort von Jack Giffin unten. Es scheint, dass concat immer noch besser und schneller ist als der Spread-Operator.
quelle
newArray.apply(newArray, dataArray1)
.Einen eleganten Weg von MDN gefunden
Oder Sie können die
spread operator
Funktion von ES6 verwenden:quelle
Löst das Ihr Problem?
quelle
Folgendes scheint mir am einfachsten zu sein:
Da "push" eine variable Anzahl von Argumenten akzeptiert, können Sie die
apply
Methode von verwendenpush
Funktion verwenden, um alle Elemente eines anderen Arrays zu pushen. Es erstellt einen Aufruf zum Push mit seinem ersten Argument ("newArray" hier) als "this" und den Elementen des Arrays als verbleibenden Argumenten.Die
slice
Anweisung in der ersten Anweisung erhält eine Kopie des ersten Arrays, sodass Sie sie nicht ändern.Update Wenn Sie eine Version von Javascript mit verfügbarem Slice verwenden, können Sie den
push
Ausdruck wie folgt vereinfachen :quelle
Die folgende Funktion hat kein Problem mit der Länge der Arrays und bietet eine bessere Leistung als alle vorgeschlagenen Lösungen:
Leider weigert sich jspref, meine Einsendungen anzunehmen. Hier sind die Ergebnisse unter Verwendung von Benchmark.js
wo
für loop und push ist:
Drücken Sie Übernehmen:
Spread-Operator:
und schließlich ist die 'eingestellte Länge und for-Schleife' die obige Funktion
quelle
𝗥𝗲𝘀𝗲𝗮𝗿𝗰𝗵 𝗔𝗻𝗱 𝗥𝗲𝘀𝘂𝗹𝘁𝘀
Für die Fakten werden ein Leistungstest bei jsperf und die Überprüfung einiger Dinge in der Konsole durchgeführt. Für die Recherche wird die Website irt.org verwendet. Unten finden Sie eine Sammlung all dieser Quellen sowie eine Beispielfunktion unten.
Wie oben gezeigt, würde ich argumentieren, dass Concat fast immer der richtige Weg ist, um sowohl Leistung als auch die Fähigkeit zu erhalten, die Spärlichkeit von Ersatz-Arrays beizubehalten. Dann
document.body.children
würde ich für Array-Likes (wie DOMNodeLists wie ) die Verwendung der for-Schleife empfehlen, da sie sowohl die zweitperformanteste als auch die einzige andere Methode ist, die spärliche Arrays beibehält. Im Folgenden werden wir schnell darauf eingehen, was unter spärlichen Arrays und Array-Likes zu verstehen ist, um Verwirrung zu beseitigen.𝗧𝗵𝗲 𝗙𝘂𝘁𝘂𝗿𝗲
Zunächst denken einige Leute vielleicht, dass dies ein Zufall ist und dass Browser-Anbieter irgendwann dazu kommen werden, Array.prototype.push so zu optimieren, dass es schnell genug ist, um Array.prototype.concat zu schlagen. FALSCH! Array.prototype.concat ist immer schneller (zumindest im Prinzip), da es sich um ein einfaches Kopieren und Einfügen über die Daten handelt. Unten finden Sie ein vereinfachtes, überzeugend-visuelles Diagramm, wie eine 32-Bit-Array-Implementierung aussehen könnte (bitte beachten Sie, dass echte Implementierungen viel komplizierter sind).
Wie oben gezeigt, ist alles, was Sie tun müssen, um so etwas zu kopieren, fast so einfach wie das Byte-für-Byte-Kopieren. Mit Array.prototype.push.apply ist es viel mehr als ein einfaches Kopieren und Einfügen über die Daten. Die ".apply" muss jeden Index im Array überprüfen und in eine Reihe von Argumenten konvertieren, bevor sie an Array.prototype.push übergeben wird. Dann muss Array.prototype.push jedes Mal zusätzlich mehr Speicher zuweisen und (für einige Browser-Implementierungen) möglicherweise sogar einige Positionssuchdaten für die Spärlichkeit neu berechnen.
Eine alternative Art, darüber nachzudenken, ist dies. Das Quellarray 1 ist ein großer Stapel zusammengehefteter Papiere. Das Quellarray zwei ist ebenfalls ein großer Papierstapel. Wäre es schneller für dich?
In der obigen Analogie steht Option 1 für Array.prototype.concat, während Option 2 für Array.prototype.push.apply steht. Lassen Sie uns dies mit einem ähnlichen JSperf testen, der sich nur darin unterscheidet, dass dieser die Methoden über spärliche Arrays und nicht über feste Arrays testet. Man kann es hier finden .
Daher ruhe ich meinen Fall aus, dass die Zukunft der Leistung für diesen speziellen Anwendungsfall nicht in Array.prototype.push liegt, sondern in Array.prototype.concat.
𝗖𝗹𝗮𝗿𝗶𝗳𝗶𝗰𝗮𝘁𝗶𝗼𝗻𝘀
𝗦𝗽𝗮𝗿𝗲 𝗔𝗿𝗿𝗮𝘆𝘀
Wenn bestimmte Mitglieder des Arrays einfach fehlen. Zum Beispiel:
Alternativ können Sie mit Javascript Ersatzarrays einfach initialisieren.
𝗔𝗿𝗿𝗮𝘆-𝗟𝗶𝗸𝗲𝘀
Ein Array-ähnliches Objekt ist ein Objekt, das mindestens eine
length
Eigenschaft hat, jedoch nicht mitnew Array
oder initialisiert wurde[]
. Beispielsweise werden die folgenden Objekte als Array-ähnlich klassifiziert.Beobachten Sie, was mit einer Methode passiert, die Array-Likes in Arrays wie Slice zwingt.
Code-Snippet anzeigen
Beobachten Sie, was ein Verfahren geschieht verwenden , die sich nicht Array-likes in Arrays wie concat zwingen.
Code-Snippet anzeigen
quelle
Mit JavaScript ES6 können Sie den Operator ... als Spread-Operator verwenden, der das Array im Wesentlichen in Werte konvertiert. Dann können Sie so etwas tun:
Obwohl die Syntax kurz ist, weiß ich nicht, wie dies intern funktioniert und welche Auswirkungen dies auf die Leistung großer Arrays hat.
quelle
Array.push.apply
Technik.Hier ist der ES6-Weg
quelle
Es gibt eine Reihe von Antworten zu Array.prototype.push.apply . Hier ist ein klares Beispiel:
Wenn Sie eine ES6-Syntax haben:
quelle
Wenn Sie das ursprüngliche Array ändern möchten, können Sie Folgendes verbreiten und verschieben:
Wenn Sie sicherstellen möchten, dass nur Elemente desselben Typs in das
source
Array aufgenommen werden (z. B. keine Zahlen und Zeichenfolgen mischen), verwenden Sie TypeScript.quelle
Wir haben zwei Arrays a und b. Der Code, der hier ausgeführt wurde, ist Array. Ein Wert wird in Array b verschoben.
quelle
Versuche dies:
quelle
Verwenden Sie anstelle der Funktion push () die Funktion concat für den IE. Beispiel,
quelle
Dies ist ein funktionierender Code und es funktioniert gut:
quelle