Typoskript - mehrdimensionale Array-Initialisierung

76

Ich spiele mit Typescript und frage mich, wie man mehrdimensionale Arrays richtig instanziiert und deklariert. Hier ist mein Code:

class Something {
    private things: Thing[][];

    constructor() {
        things = [][]; ??? how instantiate object ???

        for(var i: number = 0; i < 10; i++) {
            this.things[i] = new Thing[];   ??? how instantiate 1st level ???
            for(var j: number = 0; j< 10; j++) {
                this.things[i][j] = new Thing();   ??? how instantiate 2nd lvl item ???
            }
        }
    }
}

Können Sie mir einen Hinweis zu ausgewählten Orten geben?

Fka
quelle

Antworten:

107

Sie müssen nur []ein Array instanziieren - dies gilt unabhängig von seinem Typ. Die Tatsache, dass das Array vom Typ Array ist, spielt keine Rolle.

Das Gleiche gilt für die erste Ebene in Ihrer Schleife. Es ist lediglich ein Array und []ein neues leeres Array - Arbeit erledigt.

Was die zweite Stufe betrifft, Thingist eine Klasse new Thing()in Ordnung. Andernfalls benötigen Sie je nach Typ möglicherweise eine Factory-Funktion oder einen anderen Ausdruck, um einen zu erstellen.

class Something {
    private things: Thing[][];

    constructor() {
        this.things = [];

        for(var i: number = 0; i < 10; i++) {
            this.things[i] = [];
            for(var j: number = 0; j< 10; j++) {
                this.things[i][j] = new Thing();
            }
        }
    }
}
Hündchen
quelle
Ich kann mir nicht vorstellen, wie hier Typisierungen erhalten bleiben. Können Sie mir bitte Beispiele geben?
Fka
2
Das Array enthält 0 Elemente, sodass kein Wert oder Objekt eingegeben werden muss.
Welpe
Ich denke, es sollte this.things = [];im Konstruktor sein.
CGFoX
12

Wenn Sie es tun möchten, tippen Sie:

class Something {

  areas: Area[][];

  constructor() {
    this.areas = new Array<Array<Area>>();
    for (let y = 0; y <= 100; y++) {
      let row:Area[]  = new Array<Area>();      
      for (let x = 0; x <=100; x++){
        row.push(new Area(x, y));
      }
      this.areas.push(row);
    }
  }
}
RMuesi
quelle
Vielen Dank, aber nicht jeder verwendet AngularJs, um JS / TS-Code zu schreiben.
Fka
8
Dies ist nur Standard-TS-Code, oder? Was sehen Sie als AngularJs spezifisch? Ich bevorzuge diese Lösung mit Typen. Danke
Was wäre cool
@WhatWouldBeCool Die Antwort wurde bearbeitet, um AngularJs spezifischen Code zu entfernen
Mattumotu
12

Hier ist ein Beispiel für die Initialisierung eines Booleschen [] []:

const n = 8; // or some dynamic value
const palindrome: boolean[][] = new Array(n)
                                   .fill(false)
                                   .map(() => new Array(n)
                                   .fill(false));
techguy2000
quelle
1

Sie können Folgendes tun (was ich trivial finde, aber es ist tatsächlich richtig). Für alle, die versuchen, ein zweidimensionales Array in TypeScript zu initialisieren (wie ich).

Angenommen, Sie möchten ein zweidimensionales Array eines beliebigen Typs initialisieren. Sie können Folgendes tun

const myArray: any[][] = [];

Und später, wenn Sie es füllen möchten, können Sie Folgendes tun:

myArray.push([<your value goes here>]);

Ein kurzes Beispiel für das Obige kann das Folgende sein:

const myArray: string[][] = [];
myArray.push(["value1", "value2"]);

geocfu
quelle
-3

Achten Sie auf die Verwendung der Push-Methode. Wenn Sie keine Indizes verwenden, funktioniert dies nicht!

var main2dArray: Things[][] = []

main2dArray.push(someTmp1dArray)
main2dArray.push(someOtherTmp1dArray)

gibt nur ein 1-Zeilen-Array !

verwenden

main2dArray[0] = someTmp1dArray
main2dArray[1] = someOtherTmp1dArray

damit dein 2d Array funktioniert !!!

Andere Vorsicht! foreach scheint nicht mit 2D-Arrays zu funktionieren !

Pipo
quelle