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"));

86voto

Fred Punkte 895

Der einfachste Weg:

var myArray = [[]];

31 Stimmen

Die ein 2-dimensionales Array ist

17 Stimmen

Ja, seien Sie vorsichtig damit. Zuweisen myArray[0][was auch immer] ist in Ordnung, aber versuchen und setzen myArray[1][was auch immer] und es beschwert sich, dass myArray[1] undefiniert ist.

25 Stimmen

@Philip Sie müssen einstellen myArray[1]=[]; vor der Zuweisung myArray[1][0]=5;

47voto

James Conigliaro Punkte 3799

Der Grund, warum manche sagen, dass dies nicht möglich ist, liegt darin, dass ein zweidimensionales Feld eigentlich nur ein Feld von Feldern ist. Die anderen Kommentare hier bieten perfekt gültige Methoden zur Erstellung von zweidimensionalen Arrays in JavaScript, aber die reinste Sichtweise wäre, dass Sie ein eindimensionales Array von Objekten haben, jedes dieser Objekte wäre ein eindimensionales Array, bestehend aus zwei Elementen.

Das ist also die Ursache für die gegensätzlichen Standpunkte.

43 Stimmen

Nein, das ist es nicht. In einigen Sprachen können Sie mehrdimensionale Arrays haben wie string[3,5] = "foo"; . Für einige Szenarien ist dies ein besserer Ansatz, da die Y-Achse nicht wirklich ein Kind der X-Achse ist.

4 Stimmen

Sobald der zugrunde liegende Maschinencode erreicht ist, sind alle Tensoren der Dimension > 1 Arrays von Arrays, unabhängig von der Sprache, über die wir sprechen. Es lohnt sich, dies aus Gründen der Cache-Optimierung zu bedenken. Jede anständige Sprache, die sich ernsthaft mit numerischen Berechnungen befasst, ermöglicht es Ihnen, Ihre mehrdimensionale Struktur im Speicher so auszurichten, dass die am häufigsten verwendete Dimension zusammenhängend gespeichert wird. Python's Numpy, Fortran und C fallen mir da ein. In der Tat gibt es Fälle, in denen es sich lohnt, die Dimensionalität aus diesem Grund auf mehrere Strukturen zu reduzieren.

0 Stimmen

Computer haben keine Vorstellung von Dimensionen. Es gibt nur 1 Dimension, die Speicheradresse. Alles andere ist nur notatorische Dekoration zum Nutzen des Programmierers.

39voto

Sergio Abreu Punkte 2326

Nur wenige Menschen zeigen den Einsatz von Push:
Um etwas Neues zu bringen, zeige ich Ihnen, wie Sie die Matrix mit einem Wert initialisieren können, z.B. 0 oder eine leere Zeichenkette "".
Erinnern, dass, wenn Sie eine 10 Elemente Array haben, in Javascript der letzte Index 9 sein wird!

function matrix( rows, cols, defaultValue){

  var arr = [];

  // Creates all lines:
  for(var i=0; i < rows; i++){

      // Creates an empty line
      arr.push([]);

      // Adds cols to the empty line:
      arr[i].push( new Array(cols));

      for(var j=0; j < cols; j++){
        // Initializes:
        arr[i][j] = defaultValue;
      }
  }

return arr;
}

Anwendungsbeispiele:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0

0 Stimmen

Ich entferne letzte for (die den Standardwert festlegt) aus Ihrer Prozedur und schreiben Sie m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m)); - und wir erhalten eine sehr strenge Matrix (zu viel verschachtelt) - Sie reparieren sie im letzten for-defaultValue-Schritt, aber ich denke, Sie können die Prozedur umschreiben, um weniger verschachtelte Arrays zu verwenden, bevor Sie Standardwerte festlegen.

1 Stimmen

Für die Javascript-Welt ist dies die perfekte Lösung. Vielen Dank für die Bereitstellung dieser Lösungen

0 Stimmen

Sie sind so freundlich AMIC

30voto

domenukk Punkte 943

Zweizeiler:

var a = []; 
while(a.push([]) < 10);

Es wird ein Array a der Länge 10 erzeugt, das mit Arrays gefüllt ist. (Push fügt ein Element zu einem Array hinzu und gibt die neue Länge zurück)

14 Stimmen

Einzeiler: for (var a=[]; a.push([])<10;); ?

0 Stimmen

@Bergi wird die Variable a auch in der nächsten Zeile noch definiert sein?

1 Stimmen

@StinkyCat: Ja, so ist es. var funktioniert. Es ist immer funktionsorientiert.

28voto

Francesco Dondi Punkte 1042

Die vernünftigste Antwort scheint zu sein

var nrows = ~~(Math.random() * 10);
var ncols = ~~(Math.random() * 10);
console.log(`rows:${nrows}`);
console.log(`cols:${ncols}`);
var matrix = new Array(nrows).fill(0).map(row => new Array(ncols).fill(0));
console.log(matrix);

Hinweis: Wir können nicht direkt mit den Zeilen zu füllen, da fill den Konstruktor für flache Kopien verwendet, daher würden alle Zeilen die dieselbe Speicher...hier ist ein Beispiel, das zeigt, wie jede Zeile geteilt werden würde (aus anderen Antworten übernommen):

// DON'T do this: each row in arr, is shared
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo'; // also modifies arr[1][0]
console.info(arr);

0 Stimmen

Dies sollte an erster Stelle stehen. Ich habe etwas Ähnliches gemacht mit Array.apply(null, Array(nrows)) aber das hier ist viel eleganter.

0 Stimmen

Dies betrifft meinen letzten Kommentar... Internet Explorer und Opera haben keine Unterstützung für fill . Dies wird bei den meisten Browsern nicht funktionieren.

0 Stimmen

@dimgl Fill kann in diesem Fall mit einer konstanten Karte emuliert werden: Array(nrows).map(() => 0) , oder, Array(nrows).map(function(){ return 0; });

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