Kopieren von array-Elemente in ein anderes array
Habe ich ein JavaScript-array dataArray
was ich will Vorstoß in ein neues array newArray
. Außer ich will nicht newArray[0]
zu dataArray
. Ich will schieben Sie alle Elemente in das neue array:
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
);
So, jetzt das neue array enthält alle Werte der einzelnen Datenreihen. Gibt es ein Kürzel wie pushValues
zur Verfügung, so dass ich nicht haben, um die Iteration über jede einzelne dataArray
, indem die Elemente nacheinander?
- Finden Sie unter dieser url stackoverflow.com/questions/351409/appending-to-array
- Dies sollte die Antwort sein davidwalsh.name/Kombination-js-arrays
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die concat - Funktion, etwa so:
Den Wert
newArray
wird[1, 2, 3, 4]
(arrayA
undarrayB
bleiben unverändert;concat
erstellt und gibt ein neues array für das Ergebnis).Google Chrome
: schnell (concat = Sieger),Opera
: schnell (concat = Sieger),IE
: langsamer (concat = Sieger),Firefox
: slow (drücken.anwenden = Sieger, noch 10 mal langsamer als Chrome concat), ... sprechen von schlechten JS-engine-Implementierung.push
nicht nicht glätten ein array von Werten.concat
erreicht, was die Frage erfordert.function(stuff, toAdd) {stuff.push(toAdd);}
Es gibt keinen Weg, umconcat
hier. Das ist, was ich mit Ihnen nicht austauschbar. Und warum ich glaube, dassArray.prototype.push.apply(stuff, toAdd);
ist die richtige Antwort.Sofern deine arrays sind nicht riesig (siehe Einschränkung unten), können Sie die
push()
- Methode des array, das Sie Anhängen wollen Werte.push()
können mehrere Parameter, so können Sie Ihreapply()
- Methode weitergeben, das array von Werten geschoben werden wie eine Liste der Parameter der Funktion. Dies hat den Vorteil gegenüber der Verwendungconcat()
hinzufügen von Elementen zum array im Ort, anstatt ein neues array.Jedoch scheint es, dass für große arrays (in der Größenordnung von 100.000 oder mehr Mitgliedern), dieser trick kann fehlschlagen,. Für solche arrays mit einer Schleife ist ein besserer Ansatz. Sehen https://stackoverflow.com/a/17368101/96100 für details.
Möchten Sie vielleicht zu verallgemeinern dies in eine Funktion:
... oder fügen Sie es
Array
's Vorbild:... oder emulieren die original -
push()
Methode, indem Sie mehrere Parameter mit der Tatsache, dassconcat()
wiepush()
erlaubt mehrere Parameter:Hier ist ein loop-basierte version von dem letzten Beispiel, geeignet für große arrays und allen gängigen Browsern, einschließlich IE <= 8:
newArray.push.apply(newArray, dataArray1);
gibt das gleiche wieArray.prototype.push.applay(newArray,dataArra1);
Array.prototype.concat
ist nicht schlecht, sondern es ist einfach missverstanden und manchmal missbraucht. Unter diesen Umständen ist es nur falsch verstanden, aber nicht missbraucht werden.concat
ist schneller alspush
. Ob das wirklich wichtige kommt ganz auf den Kontext (für die meisten Projekte, die ich arbeiten, wäre es nicht. YMMV.) Zweitens, die Frage ist etwas zweideutig, aber es sah für mich beim ersten Lesen so, als wenn die OP wollte fügen Sie den Inhalt von einem array an das Ende eines vorhandenen Arrays, die Erhaltung der original-array, anstatt ein neues zu erstellen. Lese es jetzt nochmals, ich denke, dassconcat
und erstellen ein neues array ist wahrscheinlich gut.push.apply
ist viel viel schneller alsconcat
. Um ehrlich zu sein, habe ich geschrieben, wie Hunderte von tausenden von Zeilen der praktischen javascript-code; und doch, ich habe noch zu finden, eine einzige Reale Welt Szenario, wo es sein könnte performant zu erstellen, wird ein neues array als zum ändern eines vorhandenen array.Werde ich eine weitere hinzufügen "future-proof" Antworten
In ECMAScript 6, die Sie verwenden können, die Verbreiten syntax:
JS:
Verbreiten syntax ist noch nicht in allen gängigen Browsern. Für die aktuelle Kompatibilität, siehe dieser (ständig aktualisierten) Kompatibilitäts-Tabelle.
Sie können jedoch, verwenden, verbreiten syntax mit Babel.js.
edit:
Sehen Jack Giffin ' s Antwort weiter unten für mehr Kommentare auf die Leistung. Es scheint, concat ist immer noch besser und schneller als der spread-operator.
newArray.apply(newArray, dataArray1)
.Fand einen eleganten Weg aus MDN
Oder verwenden Sie den
spread operator
Funktion des ES6:Nicht, dass Ihr problem lösen ?
Den folgenden scheint die einfachste zu mir:
Als "push" nimmt eine variable Anzahl von Argumenten verwenden, können Sie die
apply
Methode derpush
- Funktion schieben Sie alle Elemente eines anderen array. Es bautein Aufruf von push über das erste argument ("newArray" hier) als "dieses" und der
Elemente des Arrays als die restlichen Argumente.
Den
slice
in der ersten Anweisung wird eine Kopie des ersten Arrays, so dass Sie nicht ändern.Update Wenn Sie eine version von javascript mit slice verfügbar ist, können Sie zur Vereinfachung der
push
Ausdruck:Gibt es eine Reihe von Antworten reden Array.der Prototyp.push.bewerben. Hier ist ein klares Beispiel:
JS:
Wenn Sie ES6-syntax:
JS:
Die Funktion unten nicht haben ein Problem mit der Länge des arrays und führt besser als alle vorgeschlagenen Lösungen:
leider jspref sich weigert zu akzeptieren, meine Beiträge, so sind Sie hier die Ergebnisse mit benchmark.js
wo
for-Schleife und push ist:
Schieben Gelten:
spread-operator:
und schließlich die 'festgelegte Länge und for-Schleife' wird die oben beschriebene Funktion
Mit JavaScript ES6, können Sie den ... - operator, wie in spread-operator, die im wesentlichen konvertieren Sie das array-Werte. Dann können Sie etwas wie das hier tun:
Während die syntax ist kurz, ich weiß nicht, wie diese intern arbeitet und was die Auswirkungen auf die Leistung sind auf großen arrays.
Array.push.apply
Technik.Hier ist das ES6 Weg
JS:
JS:
???????? ??? ???????
Für die Tatsachen, die eine performance test bei jsperf und die überprüfung einige Dinge in der Konsole durchgeführt werden. Für die Forschung, die website irt.org verwendet wird. Unten ist eine Auflistung von alle diese Quellen zusammen plus eine Beispiel-Funktion am Ende.
Wie oben gesehen, würde ich behaupten, dass Concat ist fast immer der Weg zu gehen für Leistung und die Fähigkeit zu behalten, die Kargheit des Ersatz-arrays. Dann für die array-mag (wie DOMNodeLists wie
document.body.children
), ich würde empfehlen die Verwendung der for-Schleife, weil es sowohl die 2. performantester und die einzige andere Methode, bei der sparse-arrays. Im folgenden werden wir schnell über das, was gemeint ist, von sparse-arrays und array-likes zu klären, die Verwirrung.??? ??????
Zunächst, einige Leute denken vielleicht, dass dies eine Eintagsfliege, und dass browser-Anbieter schließlich erhalten rund um die Optimierung von Array.der Prototyp.drücken, um schnell genug zu schlagen Array.der Prototyp.concat. FALSCH! Array.der Prototyp.concat wird immer schneller (zumindest im Prinzip), weil es eine einfache copy-n-paste über die Daten. Unten ist eine vereinfachte persuado-visuelle Diagramm, was ein 32-bit array-Implementierung könnte so Aussehen (bitte beachten Sie realen Implementierungen sind VIEL komplizierter)
Wie oben gesehen, ist alles was Sie tun müssen, um zu kopieren, sowas ist fast so einfach wie kopieren, byte-für-byte. Mit Array.der Prototyp.push.gelten, es ist viel mehr als ein einfaches copy-n-paste über die Daten. Die ".anwenden" ist zu prüfen, jeder index im array und wandelt es in eine Reihe von Argumenten, vor der übergabe an Array.der Prototyp.push. Dann, Array.der Prototyp.push hat außerdem mehr Speicher zuzuweisen, jedes mal, und (bei einigen browser-Implementierungen), vielleicht sogar neu berechnen einige position-lookup-Daten für Kargheit.
Einen alternativen Weg zu denken ist. Das Quell-array ist ein großer Stapel Papiere zusammen geheftet. Das Quell-array zwei ist auch noch ein großer Stapel Papiere. Wäre es schneller für Sie zu
In der obigen Analogie, option #1 repräsentiert Array.der Prototyp.concat, während #2 repräsentiert Array.der Prototyp.push.gelten. Lassen Sie uns testen Sie dies mit einem ähnlichen JSperf die sich nur in, dass diese tests der Methoden über sparse arrays, keine festen arrays. Kann man es gleich hier.
Also, ich rest mein Fall, der die Zukunft der performance für diesen Anwendungsfall liegt nicht in der Reihe.der Prototyp.push, sondern in der Reihe.der Prototyp.concat.
??????????????
????? ??????
Wenn bestimmte Elemente des Arrays sind einfach nicht vorhanden ist. Zum Beispiel:
JS:
Alternativ mit javascript können Sie zum initialisieren Ersatz-arrays leicht.
?????-?????
Eines Arrays wird ein Objekt, für das mindestens ein
length
Eigenschaft, aber wurde nicht initialisiert, mitnew Array
oder[]
; Zum Beispiel die unter-Objekte werden klassifiziert als array-like.Beobachten, was passiert mit eine Methode, die zwingen array-mag in arrays wie slice.
JS:
Beobachten, was passiert mit eine Methode, die nicht zwingen array-mag in arrays wie z.B. concat.
JS:
Wir haben zwei Arrays a und b. der code, was hier getan array ein Wert, der geschoben wird, in ein array b.
Wenn Sie möchten, ändern Sie die original-array, können Sie zu verbreiten und drücken Sie:
Wenn Sie sicherstellen möchten, dass nur Elemente des gleichen Typs gehen in der
source
array (mischen nicht zahlen und strings zum Beispiel), dann verwenden Sie Typoskript.anstelle von push () - Funktion verwenden, die concat-Funktion für den IE. Beispiel
Dies ist eine funktionierende code-und es funktioniert: