Угловая машинопись, не может нажать на массив. Неопределенный - PullRequest
0 голосов
/ 10 сентября 2018

Я новичок в угловых и мой JavaScript является основным. Я пытаюсь написать программу, решающую головоломки Судоку. Сетка 9x9 будет иметь 81 пункт или квадрат. Я подумал, что смогу быстрее проверять нарушения правил судоку (без повторов числа в одной строке, столбце или 3х3 по секторам), если бы я организовал точки в три одинаковых списка по 81, но организовал три разных способа. Опять же, по столбцу, строке и сектору.

Итак: я хотел бы получить массив, который содержит три массива, который содержит девять массивов, который содержит девять точек.

Я знаю, что Array<Array<Point>> имеет длину 9. Я объявил его как таковой, и когда я дважды проверяю журнал консоли, кажется, что он имеет длину 9. Итак, я подумал, что есть 9 нулей Array<Point> внутри. Я подумал, что могу просто набрать очки на любой из этих 9 массивов, но мне не повезло. Мне постоянно говорят, что grid[0][x] не определено. Есть идеи? Спасибо.

  gridByX:Array<Array<Point>> = new Array<Array<Point>>(9);
  gridByY:Array<Array<Point>> = new Array<Array<Point>>(9);
  gridByS:Array<Array<Point>> = new Array<Array<Point>>(9);
  grid:Array<Array<Array<Point>>> = [this.gridByX, this.gridByY, this.gridByS];

  constructor() {}

  ngOnInit() {
    this.populateGrid();
  }

  populateGrid(){
    let counter = 0;
    for (let x = 0; x < 9; x++){
      for (let y = 0; y < 9; y++){
        let point = new Point(counter, x, y);
        this.grid[0][x].push(point);
        this.grid[1][y].push(point);
        this.grid[2][point.sector].push(point);


      }
    }
  }

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Итак, я подумал, что в нуле 9 нулей Array<Point>.

Это правильно. Однако массив null - это не то же самое, что массив empty . Прежде чем вы сможете перейти к нему, вы должны создать его экземпляр с помощью реального объекта массива.

Попробуйте это для трехстрочного решения:

gridByX:Array<Array<Point>> = new Array<Array<Point>>(9).fill().map(() => []);
gridByY:Array<Array<Point>> = new Array<Array<Point>>(9).fill().map(() => []);
gridByS:Array<Array<Point>> = new Array<Array<Point>>(9).fill().map(() => []);

fill без аргументов инициализирует его значениями 9 undefined, которые затем заменяются пустыми массивами.

0 голосов
/ 10 сентября 2018

Вы не можете использовать this вне области действия экземпляра, поэтому строку: grid:Array<Array<Array<Point>>> = [this.gridByX, this.gridByY, this.gridByS]; нельзя присвоить в качестве свойства класса

, просто оставьте grid:Array<Array<Array<Point>>>; для объявления свойства и сделайте присваивание в constructor() {} звоните

0 голосов
/ 10 сентября 2018
 gridByX:Array<Array<Point>> = new Array<Array<Point>>(9);
  gridByY:Array<Array<Point>> = new Array<Array<Point>>(9);
  gridByS:Array<Array<Point>> = new Array<Array<Point>>(9);
  grid:Array<Array<Array<Point>>> = [this.gridByX, this.gridByY, this.gridByS];

  constructor() {}

  ngOnInit() {
    this.populateGrid();
  }

  populateGrid(){
    let counter = 0;
    for (let x = 0; x < 9; x++){
      for (let y = 0; y < 9; y++){
        let point = new Point(counter, x, y);

        grid[0][x] = grid[0][x] || [];
        grid[0][x].push(point);

        grid[1][y] = grid[1][y] || [];
        grid[1][y].push(point);

        grid[2][point.sector] = grid[2][point.sector] || [];
        grid[2][point.sector].push(point);
      }
    }
  }

Попробуйте определить свойство индекса, прежде чем манипулировать им.

...