Javascript 角度类型脚本,无法推送到数组。未定义

Javascript 角度类型脚本,无法推送到数组。未定义,javascript,arrays,angular,typescript,undefined,Javascript,Arrays,Angular,Typescript,Undefined,我不熟悉angular,我的JavaScript是基本的。我正试图写一个解决数独难题的程序。9x9网格将有81个点或正方形。我想,如果我将这些点组织成三个相同的81个列表,但以三种不同的方式组织,我可以更快地检查违反数独规则的情况(在一行、一列或三个扇区内没有数字重复)。同样,按列、行和扇区 所以:我想要一个数组,它包含三个数组,九个数组,九个点 我知道数组的长度为9。我声明它是这样的,当我仔细检查控制台日志时,它的长度似乎是9。所以我认为里面有9个空值Array。我想我可以把点推到这9个数组中

我不熟悉angular,我的JavaScript是基本的。我正试图写一个解决数独难题的程序。9x9网格将有81个点或正方形。我想,如果我将这些点组织成三个相同的81个列表,但以三种不同的方式组织,我可以更快地检查违反数独规则的情况(在一行、一列或三个扇区内没有数字重复)。同样,按列、行和扇区

所以:我想要一个数组,它包含三个数组,九个数组,九个点

我知道
数组的长度为9。我声明它是这样的,当我仔细检查控制台日志时,它的长度似乎是9。所以我认为里面有9个空值
Array
。我想我可以把点推到这9个数组中的任何一个,但我没有运气。我一直被告知
网格[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);


      }
    }
  }
gridByX:Array=新数组(9);
gridByY:Array=新数组(9);
gridByS:Array=新数组(9);
grid:Array=[this.gridByX,this.gridByY,this.gridByS];
构造函数(){}
恩戈尼尼特(){
这是populateGrid();
}
populateGrid(){
设计数器=0;
for(设x=0;x<9;x++){
for(设y=0;y<9;y++){
设点=新点(计数器,x,y);
此.grid[0][x].push(点);
此.grid[1][y].push(点);
此.grid[2][point.sector].push(point);
}
}
}
gridByX:Array=新数组(9);
gridByY:Array=新数组(9);
gridByS:Array=新数组(9);
grid:Array=[this.gridByX,this.gridByY,this.gridByS];
构造函数(){}
恩戈尼尼特(){
这是populateGrid();
}
populateGrid(){
设计数器=0;
for(设x=0;x<9;x++){
for(设y=0;y<9;y++){
设点=新点(计数器,x,y);
网格[0][x]=网格[0][x]| |[];
网格[0][x]。推送(点);
网格[1][y]=网格[1][y]| |[];
网格[1][y]。推送(点);
网格[2][point.sector]=网格[2][point.sector]| |[];
网格[2][点.扇区].推送(点);
}
}
}
在操作索引属性之前,请尝试定义它

所以我认为里面有9个null
Array

这是正确的。但是,空数组与空数组不同。在推送它之前,必须用实际的数组对象实例化它

请尝试以下三行解决方案:

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(() => []);
gridByX:Array=newarray(9.fill().map(()=>[]);
gridByY:Array=newarray(9.fill().map(()=>[]);
gridByS:Array=newarray(9.fill().map(()=>[]);

fill
不带参数将其初始化为9个
未定义的
值,然后用空数组替换。

您不能在实例范围之外使用
,因此行:
grid:Array=[this.gridByX,this.gridByY,this.gridByS]
不能指定为类属性


只需离开
grid:Array
用于属性声明,并在
构造函数(){}
调用中进行赋值

当您创建
新数组(n)
时,它会创建一个包含
n
未定义元素的数组。然后,可以使用括号表示法指定元素(例如:
array[x]=newpoint()
)。此外,您只能在阵列上调用
.push
。在本例中,您的语法应该如下所示:
grid[0][x]=newpoint(counter,x,y)
可能我误解了,但是grid[0][x]是一个数组。我不认为它可以定义为像网格[0][x]=新点(计数器,x,yz)这样的单点。但是对于未定义的元素,你是对的,但是如果我在每个循环中创建一个新的数组,我只会被一个一点的数组困住,而不是我想要的9点数组。我想我需要检查数组是否未定义,如果是的话,创建一个,但是如果不是的话,请点击这里。啊,很抱歉。在将元素推送到循环中之前,您需要先在循环中定义网格[0][x]。谢谢。我知道必须有一个更简单的方法。我做了一些编辑,这样如果数组未定义,它将被实例化,然后添加一个点。如果定义了数组,则会添加该数组。认为这解决了问题,但如果不是,我肯定会使用填充,我不知道存在。非常感谢!事实上,不要这样做,我忘记了当您将
fill
与对象(包括子数组)一起使用时,它具有有趣的行为。我将用一个更好的简短解决方案更新我的答案。(如果您感到好奇,原始解决方案将填充同一数组的九个引用,因此将值推送到其中一个将推送到所有九个)
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(() => []);