Was ist der effizienteste Weg, um N Arrays von Objekten in JavaScript zu verketten?
Die Arrays sind veränderbar und das Ergebnis kann in einem der Eingabearrays gespeichert werden.
javascript
arrays
Leonid
quelle
quelle
Antworten:
Wenn Sie mehr als zwei Arrays verketten,
concat()
ist dies der richtige Weg, um Komfort und wahrscheinliche Leistung zu erzielen.Um nur zwei Arrays zu verketten, kann die Tatsache, dass
push
mehrere Argumente akzeptiert werden, die aus Elementen bestehen, die dem Array hinzugefügt werden sollen, stattdessen verwendet werden, um Elemente von einem Array zum Ende eines anderen hinzuzufügen, ohne ein neues Array zu erzeugen. Mitslice()
kann es auch anstelle von verwendet werden,concat()
aber es scheint keinen Leistungsvorteil zu geben, wenn dies getan wird .In ECMAScript 2015 und höher kann dies noch weiter reduziert werden
Es scheint jedoch, dass bei großen Arrays (in der Größenordnung von 100.000 Mitgliedern oder mehr) die Technik, an die ein Array von Elementen übergeben wird
push
(entweder unter Verwendungapply()
oder des ECMAScript 2015-Spread-Operators), 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 .quelle
a.concat(b)
Testfall scheint unnötig eine Kopie des Arrays zu erstellen unda
es dann wegzuwerfen.concat()
es im Allgemeinen schneller zu sein. Für den Fall der Verkettung eines Arrays mit einem vorhandenen Arraypush()
ist dies der richtige Weg. Ich habe meine Antwort aktualisiert.Bearbeiten : Effizienznachweis: http://jsperf.com/multi-array-concat/7
edit2 : Tim Supinie erwähnt in den Kommentaren, dass dies dazu führen kann, dass der Interpreter die Größe des Aufrufstapels überschreitet. Dies hängt möglicherweise von der js-Engine ab, aber ich habe auch zumindest in Chrome die Option "Maximale Call-Stack-Größe überschritten" erhalten. Testfall :
[].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))
. (Ich habe auch den gleichen Fehler bei der Verwendung der aktuell akzeptierten Antwort erhalten, sodass man solche Anwendungsfälle vorwegnimmt oder eine Bibliothek für andere erstellt. Je nachdem, welche Lösung Sie wählen, sind möglicherweise spezielle Tests erforderlich.)quelle
Für Benutzer von ES2015 (ES6)
Sie können jetzt die Spread-Syntax verwenden, um Arrays zu verketten:
quelle
Die
concat()
Methode wird verwendet, um zwei oder mehr Arrays zu verbinden. Die vorhandenen Arrays werden nicht geändert, sondern nur eine Kopie der verknüpften Arrays zurückgegeben.quelle
concat
wird speziell zum Erstellen neuer Arrays verwendet, ohne das ursprüngliche Array zu mutieren. Wenn Sie aktualisieren möchtenarray1
, müssen Siearray1.push(...array2, ...array3, ...array4)
Verwenden Sie Array.prototype.concat.apply, um die Verkettung mehrerer Arrays zu verarbeiten:
Beispiel:
quelle
Wenn Sie gerade dabei sind, das Ergebnis durch Map / Filter / Sort usw. zu leiten, und Sie ein Array von Arrays zusammenfassen möchten, können Sie es verwenden
reduce
quelle
Verwenden Sie für ein Array mit mehreren Arrays und ES6
Beispielsweise:
quelle
newArr = Array.from(new Set(newArr));
.any[]
? Das Tippen ist da - komisch.[].concat.apply([], ...arr)
bei großen Volumes eine deutlich bessere Leistung.Jetzt können wir mehrere Arrays mit kombinieren
ES6
Spread
.concat()
Versuchen Sie, mithilfe der Spread-Syntax mehrere Arrays zu einem reduzierten Array zu kombinieren, anstatt Arrays zu verketten. z.B:quelle
so gelöst.
quelle
Sie können die Website jsperf.com verwenden , um die Leistung zu vergleichen. Hier ist der Link zu concat .
Vergleich hinzugefügt zwischen:
und:
Der zweite ist in Chrom fast zehnmal langsamer.
quelle
push.apply()
, was schneller zu sein scheint alsconcat()
in allen Browsern außer Chrome. Siehe meine Antwort.Einfach mit der Concat-Funktion:
quelle
Hier ist eine Funktion, mit der Sie mehrere Arrays verketten können
Beispiel -
wird ausgegeben
quelle
Wenn Sie ein Array von Arrays haben und die Elemente zu einem einzigen Array zusammenfassen möchten, versuchen Sie den folgenden Code (erfordert ES2015):
Oder wenn Sie sich für funktionale Programmierung interessieren
Oder noch besser mit ES5-Syntax ohne den Spread-Operator
Dieser Weg ist praktisch, wenn Sie die Nr. Nicht kennen. von Arrays zur Codezeit.
quelle
Mit ES6 kürzen.
Dadurch werden die mehreren Arrays konkattiert und eindeutig .
Demo auf Codepen
quelle
new Set()
entfernt doppelte Elemente. Entfernen Sie es einfach.[].concat(...Array)
Array mit Push zusammenführen:
Verwenden des Concat and Spread-Operators:
quelle
Dabei ist 'n' eine Anzahl von Arrays, möglicherweise ein Array von Arrays. . .
var answer = _.reduce (n, Funktion (a, b) {return a.concat (b)})
quelle
Wenn nur zwei Arrays zu verknüpfen sind und Sie tatsächlich anhängen müssen eines der Arrays anstatt ein neues zu erstellen, ist Push oder Loop der Weg.
Benchmark: https://jsperf.com/concat-small-arrays-vs-push-vs-loop/
quelle
Versuche dies:
quelle
Wenn die N Arrays aus der Datenbank stammen und nicht fest codiert sind, mache ich das mit ES6 so
quelle