372 Stimmen

Was ist der effizienteste Weg, um N Arrays zu verketten?

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 Eingabe-Arrays gespeichert werden.

437voto

Tim Down Punkte 304837

Wenn Sie mehr als zwei Arrays verketten, concat() ist die beste Lösung, wenn es um Komfort und Leistung geht.

var a = [1, 2], b = ["x", "y"], c = [true, false];
var d = a.concat(b, c);
console.log(d); // [1, 2, "x", "y", true, false];

Bei der Verkettung von nur zwei Arrays ist die Tatsache, dass push mehrere Argumente akzeptiert, die aus Elementen bestehen, die dem Array hinzugefügt werden sollen, kann stattdessen verwendet werden, um Elemente aus einem Array an das Ende eines anderen hinzuzufügen, ohne ein neues Array zu erzeugen. Mit slice() kann es auch anstelle von concat() sondern Es scheint keinen Leistungsvorteil zu geben, wenn man dies tut. .

var a = [1, 2], b = ["x", "y"];
a.push.apply(a, b);
console.log(a); // [1, 2, "x", "y"];

In ECMAScript 2015 und später kann dies noch weiter reduziert werden auf

a.push(...b)

Es scheint jedoch, dass bei großen Arrays (in der Größenordnung von 100.000 Elementen oder mehr) die Technik, ein Array von Elementen an push (entweder mit apply() oder der ECMAScript 2015 Spread-Operator) kann fehlschlagen. Für solche Arrays ist die Verwendung einer Schleife ein besserer Ansatz. Siehe https://stackoverflow.com/a/17368101/96100 für Einzelheiten.

198voto

ninjagecko Punkte 82995
[].concat.apply([], [array1, array2, ...])

bearbeiten : Nachweis der Effizienz: http://jsperf.com/multi-array-concat/7

bearbeiten2 : Tim Supinie erwähnt in den Kommentaren, dass dies dazu führen kann, dass der Interpreter die Größe des Aufrufstapels überschreitet. Dies ist vielleicht abhängig von der js-Engine, aber ich habe auch "Maximum call stack size exceeded" zumindest auf Chrome bekommen. Testfall: [].concat.apply([], Array(300000).fill().map(_=>[1,2,3])) . (Ich habe auch den gleichen Fehler mit der derzeit akzeptierten Antwort erhalten, so dass man solche Anwendungsfälle vorwegnimmt oder eine Bibliothek für andere baut, können spezielle Tests notwendig sein, egal welche Lösung Sie wählen).

58voto

David Punkte 2008

Neue Antwort

Für Arrays mit mehreren Arrays und ES6, verwenden Sie

arr.flat();

Zum Beispiel:

const arr = [[1, 2, 3], [4, 5, 6], [7, 8 ,9]];
const newArr = arr.flat();
// output: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

Dies funktioniert mit Node > 11 und modernen Browsern.


Alte Antwort

(ich lasse es hier, falls es für alte Node-Versionen benötigt wird):

Für Arrays mit mehreren Arrays und ES6, verwenden Sie

Array.prototype.concat(...arr);

Zum Beispiel:

const arr = [[1, 2, 3], [4, 5, 6], [7, 8 ,9]];
const newArr = Array.prototype.concat(...arr);
// output: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

50voto

Duncan Lukkenaer Punkte 8655

Für Benutzer von ES2015 (ES6)

Sie können nun die Spread-Syntax verwenden, um Arrays zu verketten:

const arr1 = [0, 1, 2],
      arr2 = [3, 4, 5];

const result1 = [...arr1, ...arr2]; // -> [0, 1, 2, 3, 4, 5]

// or...

const result2 = [...arr2, ...arr1]; // -> [3, 4, 5, 0, 1, 2]

38voto

Burnee Punkte 2261

Verwenden Sie Array.prototype.concat.apply, um die Verkettung mehrerer Arrays zu behandeln:

var resultArray = Array.prototype.concat.apply([], arrayOfArraysToConcat);

Ejemplo:

var a1 = [1, 2, 3],
    a2 = [4, 5],
    a3 = [6, 7, 8, 9];
Array.prototype.concat.apply([], [a1, a2, a3]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X