Dies ist ein einfacher Artikel mit einigen Tipps zur Verwendung von JavaScript-Arrays. Wir werden verschiedene Methoden verwenden, um zwei JS-Arrays zu kombinieren/zusammenzuführen, und die Vor- und Nachteile jeder Methode diskutieren.
Betrachten wir zunächst die folgende Situation:
concat(..)
Dies ist der gebräuchlichste Ansatz:
Wie Sie sehen können, ist C ein brandneues Array, das die Kombination der beiden Arrays a und b darstellt, wobei A und B unverändert bleiben. Einfach, oder?
Aber was ist, wenn a 10.000 Elemente hat und b auch 10.000 Elemente? C wird 20.000 Elemente haben, sodass sich die Speichernutzung von a und b verdoppelt.
„Kein Problem!“, sagen Sie. Lassen Sie sie im Müll sammeln, setzen Sie A und B auf Null, das Problem ist gelöst!
Schleifeneinfügung
Okay, kopieren wir den Inhalt eines Arrays in ein anderes, indem wir Folgendes verwenden: Array#push(..)
Scheint einen besseren Speicherbedarf zu haben.
Aber was ist, wenn Array a kleiner ist? Aus Speicher- und Geschwindigkeitsgründen möchten Sie möglicherweise das kleinere a vor b setzen. Kein Problem, ersetzen Sie einfach push(..) durch unshift(..):
Funktionstipps
Allerdings ist die for-Schleife tatsächlich hässlich und schwer zu warten. Können wir es besser machen?
Dies ist unser erster Versuch mit Array#reduce:
a; // [1,2,3,4,5,6,7,8,9,"foo",bar",baz",bam",bun",fun"]
// oder `a` in `b`:
b = a.reduceRight( function(coll,item){
coll.unshift(item);
Rückgabekoll;
}, b );
b; // [1,2,3,4,5,6,7,8,9,"foo",bar",baz",bam",bun",fun"]
Array#reduce(..) und Array#reduceRight(..) sind nett, aber etwas klobig. Die Pfeilfunktionen von ES6=> reduzieren die Codemenge etwas, erfordern aber immer noch eine Funktion, die für jedes Element einmal aufgerufen werden muss, was nicht perfekt ist.
Wie wäre es damit:
a; // [1,2,3,4,5,6,7,8,9,"foo",bar",baz",bam",bun",fun"]
// oder `a` in `b`:
b.unshift.apply( b, a );
b; // [1,2,3,4,5,6,7,8,9,"foo",bar",baz",bam",bun",fun"]
Dieses ist viel besser, oder? Zumal sich die Methode unshift(..) hier nicht um die bisherige umgekehrte Sortierung kümmern muss. Die Span-Operation von ES6 wird schöner sein: a.push( ...b) oder b.unshift( ...a
Maximale Array-Längenbeschränkung
Das erste große Problem besteht darin, dass sich die Speichernutzung verdoppelt hat (vorübergehend natürlich!) und was angehängt wird, ist im Grunde das Kopieren von Elementen auf den Stapel über Funktionsaufrufe. Darüber hinaus gibt es bei verschiedenen JS-Engines Einschränkungen hinsichtlich der Länge der kopierten Daten.
Wenn das Array also eine Million Elemente hat, überschreiten Sie definitiv die Grenze des für push(...) oder unshift(...) zulässigen Aufrufstapels. Mit ein paar tausend Elementen wird es leider gut funktionieren, aber Sie müssen darauf achten, angemessene Längengrenzen nicht zu überschreiten.
Hinweis: Sie können splice(...) ausprobieren, was das gleiche Problem wie push(...) und unshift(...) hat.
Es gibt eine Möglichkeit, diese maximale Längenbeschränkung zu umgehen.
Moment mal, unsere Lesbarkeit ist rückwärts. Das ist es, es kann schlimmer werden, wenn es sich verändert, haha.