2017-01-16 4 views
0

Ich möchte ein Array 3d mit Nullen in allen Positionen initialisieren. Ich verwende ein for cycle meine Matrix zum Füllen, aber wenn ich getestet, bekomme ich einen Fehler TypeError: this.matrix[x][y] is undefined ich diese:Für in Javascript Array 3d

class Cube { 

    constructor(size) { 
     this.size = size 
     this.matrix = [ [ [] ], [ [] ] ] 
     this.createMatrix(size) 
    } 

    getsize() { 
     return this.size 
    } 

    /*Fill matrix with zeros*/ 
    createMatrix(size) { 
     for (var x = 0; x < size; x++) { 
      for (var y = 0; y < size ; y++) { 
       for (var z = 0; z < size ; z++) { 
        this.matrix[x][y][z] = 0 
       } 
      } 
     } 
     console.log(this.matrix) 
    } 
} 

myCube = new Cube(4) 

Wie kann ich meine Matrix füllen?

Antwort

2

Sie haben jedes Element im Array zu prüfen, ob es noch nicht initialisiert wurde, und in einem solchen Fall werden Sie es zu Array festlegen müssen:

class Cube { 
 

 
    constructor(size) { 
 
    this.size = size 
 
    this.matrix = [ ] 
 
    this.createMatrix(size) 
 
    } 
 

 
    getsize() { 
 
    return this.size 
 
    } 
 

 
    /*Fill matrix with zeros*/ 
 
    createMatrix(size) { 
 
    for (var x = 0; x < size; x++) { 
 
     for (var y = 0; y < size ; y++) { 
 
     for (var z = 0; z < size ; z++) { 
 
      if (!Array.isArray(this.matrix[x])) { 
 
      this.matrix[x] = [] 
 
      } 
 
      if (!Array.isArray(this.matrix[x][y])) { 
 
      this.matrix[x][y] = [] 
 
      } 
 
      if (!Array.isArray(this.matrix[x][y][z])) { 
 
      this.matrix[x][y][z]= [] 
 
      } 
 
      this.matrix[x][y][z] = 0 
 
     } 
 
     } 
 
    } 
 
    console.log(this.matrix) 
 
    } 
 
} 
 

 
myCube = new Cube(4)

+1

Hinweis: 'typeof' ist keine Funktion, also sind Klammern nicht erforderlich und' typeof [] 'gibt' "object" 'zurück, also ist es keine gute Methode um zu überprüfen ob etwas ein Array ist. –

+0

@MikeC danke für den Kommentar! Geändert zu 'Array.isArray' anstelle von typeof – Dekel

+0

Danke @Dekel, Ihre Antwort war nützlich für mich. – CarMoreno

2

Das liegt daran, dass Sie jedes einzelne Array initialisieren müssen. Denken Sie daran: Ein 3D-Array ist ein Array von Arraysvon Arrays.

function threeDArray(width, height, depth) { 
 
    var result = []; 
 
    for (var x = 0; x < width; x++) { 
 
    result[x] = []; 
 
    for (var y = 0; y < height; y++) { 
 
     result[x][y] = []; 
 
     for (var z = 0; z < depth; z++) { 
 
     result[x][y][z] = 0; 
 
     } 
 
    } 
 
    } 
 
    return result; 
 
} 
 

 
console.log(threeDArray(3, 3, 3));

+0

Sie Mike danken. – CarMoreno

2

Sie können Array.from({ length: n }) verwenden, um zu erstellen leere Arrays von n Länge, und füllen sie mit Nullen die fill() Methode:

const emptyArray = n => Array.from({ length: n }); 
 

 
const createMatrix = n => emptyArray(n).map(() => 
 
    emptyArray(n).map(() => emptyArray(n).fill(0)) 
 
); 
 

 
console.log(createMatrix(4));