Hier ist eine schnelle Methode, die ich gefunden habe, um ein zweidimensionales Array zu erstellen.
function createArray(x, y) {
return Array.apply(null, Array(x)).map(e => Array(y));
}
Sie können diese Funktion auch leicht in eine ES5-Funktion umwandeln.
function createArray(x, y) {
return Array.apply(null, Array(x)).map(function(e) {
return Array(y);
});
}
Warum das funktioniert: Die new Array(n)
Konstruktor erzeugt ein Objekt mit einem Prototyp von Array.prototype
und weist dann dem Objekt die length
was zu einem unbesetzten Feld führt. Aufgrund des Mangels an tatsächlichen Mitgliedern können wir die Array.prototype.map
Funktion auf.
Wenn Sie jedoch mehr als ein Argument für den Konstruktor angeben, z. B. wenn Sie Array(1, 2, 3, 4)
verwendet der Konstruktor die arguments
Objekt zu instanziieren und eine Array
Objekts korrekt.
Aus diesem Grund können wir Folgendes verwenden Array.apply(null, Array(x))
denn die apply
Funktion werden die Argumente in den Konstruktor übertragen. Zur Verdeutlichung, tun Array.apply(null, Array(3))
ist gleichbedeutend mit Array(null, null, null)
.
Da wir nun ein aktuelles Array erstellt haben, müssen wir nur noch die map
und erstellen Sie die zweite Ebene ( y
).
26 Stimmen
Ausgehend von einer etwas pedantischen Definition ist es technisch unmöglich, ein 2d-Array in Javascript zu erstellen. Aber Sie können ein Array von Arrays erstellen, die gleichbedeutend mit dem gleichen ist.
0 Stimmen
Duplikat von - stackoverflow.com/q/6495187/104380
0 Stimmen
Für ein 5x3 2D-Array würde ich wie folgt vorgehen
var arr2D = new Array(5).fill(new Array(3));
Wenn Sie außerdem nicht wollen, dass die Zellen "undefiniert" sind, können Sie wie folgt vorgehenvar arr2D = new Array(5).fill(new Array(3).fill("hey"));
22 Stimmen
FYI... wenn Sie ein Array mit weiteren Arrays füllen, indem Sie
var arr2D = new Array(5).fill(new Array(3));
wird jedes Element von Array(5) auf dasselbe Array(3) verweisen. Daher ist es am besten, eine for-Schleife zu verwenden, um die Unterarrays dynamisch zu füllen.91 Stimmen
a = Array(5).fill(0).map(x => Array(10).fill(0))
0 Stimmen
@JoshStribling Können Sie mir bitte erklären, warum es so ist, dass
var arr2D = new Array(5).fill(new Array(3));
nicht richtig ein 2d-Array erstellt?0 Stimmen
@MarksCode Es wird technisch gesehen ein 2D-Array erstellt, aber es wird ein Array sein, das mit Verweisen auf das gleiche einzelne Array gefüllt ist, das Sie mit der
new Array(3)
Aufruf, da dieser ausgeführt wird, um ein neues Array zu erstellen, dann wird dieses Array an die Funktion übergeben, um das Array zu füllen, das Sie füllen...5 Stimmen
Mit anderen Worten,
fill
ruft nichtnew Array(3)
für jeden Index des zu füllenden Arrays, da es sich nicht um einen Lambda-Ausdruck oder ähnliches handelt, wie z.B. Longfei Wus Kommentar oben, der das Array zunächst mit 0's füllt und dann die map-Funktion mit einem Lambda verwendet, um jedes Element mit einem neuen Array zu füllen. Die fill-Funktion füllt das Array einfach mit genau dem, was Sie ihr sagen. Ergibt das einen Sinn? Für weitere Informationen über diemap
Funktion, siehe: developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/0 Stimmen
Mögliches Duplikat von Mehrdimensionales JavaScript-Array
0 Stimmen
@Adam diese Frage scheint zwei Jahre älter zu sein als die Frage, die Sie verlinkt haben.
2 Stimmen
@kalehmann das ist gut: meta.stackoverflow.com/a/252017/2311074
If the new question is a better question or has better answers, then vote to close the old one as a duplicate of the new one.
1 Stimmen
Eine leistungsfähige ist
let AA = Array.from({ length: 2 }, () => new Array(3).fill(0));