1390 Stimmen

Wie kann ich ein zweidimensionales Array in JavaScript erstellen?

Ich habe im Internet nachgelesen, und an einigen Stellen heißt es, es sei nicht möglich, an anderen wird ein Beispiel genannt, und wieder andere widerlegen das Beispiel usw.

  1. Wie deklariere ich ein 2-dimensionales Array in JavaScript? (vorausgesetzt, es ist möglich)

  2. Wie kann ich auf die Mitglieder zugreifen? ( myArray[0][1] o myArray[0,1] ?)

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

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 vorgehen var arr2D = new Array(5).fill(new Array(3).fill("hey"));

5voto

Rick Punkte 11342

Javascript unterstützt keine zweidimensionalen Arrays, stattdessen speichern wir ein Array innerhalb eines anderen Arrays und holen die Daten aus diesem Array, je nachdem, auf welche Position des Arrays Sie zugreifen möchten. Denken Sie daran, dass die Array-Nummerierung bei ZERO .

Code-Beispiel:

/* Two dimensional array that's 5 x 5 

       C0 C1 C2 C3 C4 
    R0[1][1][1][1][1] 
    R1[1][1][1][1][1] 
    R2[1][1][1][1][1] 
    R3[1][1][1][1][1] 
    R4[1][1][1][1][1] 
*/

var row0 = [1,1,1,1,1],
    row1 = [1,1,1,1,1],
    row2 = [1,1,1,1,1],
    row3 = [1,1,1,1,1],
    row4 = [1,1,1,1,1];

var table = [row0,row1,row2,row3,row4];
console.log(table[0][0]); // Get the first item in the array

5voto

geniuscarrier Punkte 4079

One liner, um ein m*n 2-dimensionales Array zu erstellen, das mit 0 gefüllt ist.

new Array(m).fill(new Array(n).fill(0));

3 Stimmen

Eigentlich werden dadurch nur zwei Arrays erstellt. Die zweite Dimension wird das gleiche Array in jedem Index sein.

7 Stimmen

Ja, ich bestätige den Irrtum. Schnelle Lösung: a = Array(m).fill(0).map(() => Array(n).fill(0)) ? map hebt die Bindung der Referenz auf und erzeugt ein eindeutiges Array pro Slot.

3voto

Nat Punkte 9604

Sie könnten ein Array von Zeilen zuweisen, wobei jede Zeile ein Array der gleichen Länge ist. Oder Sie könnten ein eindimensionales Array mit Zeilen*Spalten-Elementen zuweisen und Methoden definieren, um Zeilen-/Spaltenkoordinaten auf Elementindizes abzubilden.

Unabhängig davon, für welche Implementierung Sie sich entscheiden, können Sie die Zugriffsmethoden in einem Prototyp definieren, um die Verwendung der API zu vereinfachen, wenn Sie sie in ein Objekt verpacken.

3voto

ravishi Punkte 3049

Ich bin kein Fan der ES6-Lösungen mit .fill() . Einige davon mögen funktionieren, aber der zusätzliche Aufwand zur Vermeidung von Copy-by-Reference-Problemen macht sie nicht intuitiv.

Mein vorgeschlagener ES6-Ansatz ist es, den Spread-Operator sowohl für äußere als auch für innere Arrays vollständig zu nutzen. Es ist einfacher, über IMO zu argumentieren.

[...Array(3)].map(() => [...Array(4)])

Wenn Sie einen Anfangswert festlegen müssen, dann verketten Sie eine .map() bei der Erstellung des inneren Arrays:

[...Array(3)].map(() => [...Array(4)].map(() => 0))

Und schließlich eine typsichere TypeScript util-Funktion:

export const createMultiDimensionalArray = <T>(
  n: number,
  m: number,
  initialVal?: T,
): T[][] => {
  const matrix = [...Array(n)].map(() => [...Array(m)]);
  return initialVal === undefined
    ? matrix
    : matrix.map(r => r.map(() => initialVal));
};

Beispiele:

const a = createMultiDimensionalArray(1, 2);
a[1][2] = 3;     // Works

const b = createMultiDimensionalArray(2, 3, false);
b[1][2] = true;  // Works
b[1][2] = 3;     // Error: Type '3' is not assignable to type 'boolean'.

3voto

Hossam Punkte 189

Das globale Objekt Array verwenden und Elemente mit Arrays füllen:

let arr = new Array(5).fill([]);

ou wenn das 2d-Array eine bekannte Länge hat:

let arr = new Array(5).fill(new Array(2));

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