角度打字稿,无法推送到数组。未定义

时间:2018-09-10 20:06:15

标签: javascript arrays angular typescript undefined

我是angular的新手,我的JavaScript很基础。我正在尝试编写解决数独难题的程序。 9x9网格将具有81个点或正方形。我认为,如果将这些点组织成三个相同的81列表,但组织了三种不同的方式,则可以更快地检查数独规则的违反情况(单个行,列或按扇区的3x3中没有重复的数字)。同样,按列,行和扇区。

所以:我想要一个包含三个Array的数组,这些Array包含九个包含九个点的Array。

我知道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 :(得分:1)

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

在操作之前尝试定义index属性。

答案 1 :(得分:0)

  

所以我一直认为里面有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值对其进行初始化,然后将其替换为空数组。

答案 2 :(得分:0)

您不能在实例范围之外使用this,因此该行: grid:Array<Array<Array<Point>>> = [this.gridByX, this.gridByY, this.gridByS]; 无法分配为类属性

只需离开grid:Array<Array<Array<Point>>>;进行属性声明,然后在constructor() {}调用中进行赋值