错误:无法读取未定义的属性“推”

时间:2019-07-02 19:18:16

标签: angular typescript runtime-error

我正在创建一个生成图形的for循环。我遇到的问题是,当我将图形生成脚本插入for循环中时,出现了错误:“无法读取datapoint数组未定义的属性'push'。但是代码在for循环之外工作。

datapoint=[[1],[1]]
LabelList=[]
Classyaverage=0
colorOption=""
ChartName = 'Chart0'
NumOfCharts = 2
ChartNum = 1
TotalChartNum = 2
ListNum = 0
counter = 0
public graphComponent: GraphComponent= new GraphComponent();
constructor(private HttpModule : Http) { } // end of constructor

public graphGenerator(){

这样的断裂

this.ListNum = 9

for(this.counter = 1; this.counter <= this.NumOfCharts; this.counter++){

  var i=0
  this.LabelList=[]
  this.ChartNum = this.counter
  this.ChartName = this.ChartName.slice(0,-1)
  this.ChartName = this.ChartName + this.counter
  console.log(this.ChartName)
  while(i< this.ListNum){
      i++
      this.LabelList.push('')
  }

  this.datapoint[this.ChartNum].push(this.Classyaverage)
  if(Object.keys(this.datapoint[this.ChartNum]).length > this.ListNum){
      this.datapoint[this.ChartNum].shift()
  }

  this.graphComponent.setGraph(this.datapoint, this.LabelList, this.ChartName, this.ChartNum)

}

像这样

var i=0
this.LabelList=[]
this.ChartNum = 1
this.ChartName = 'ChartA'
this.ListNum = 19
while(i< this.ListNum){
    i++
    this.LabelList.push('')
}

this.datapoint[this.ChartNum].push(this.Classyaverage)
if(Object.keys(this.datapoint[this.ChartNum]).length > this.ListNum){
  this.datapoint[this.ChartNum].shift()
}

this.graphComponent.setGraph(this.datapoint, this.LabelList, this.ChartName, this.ChartNum)

setTimeout(() => { this.graphGenerator(); }, 500);

}

3 个答案:

答案 0 :(得分:1)

当它超出for循环时,ChartNum等于1,那么该索引中存在数据点中的一项(数据点中的第二个条目,它从0开始),因此可以将其推入。

将其放入for循环时,ChartNum等于计数器,该计数器在每次迭代时都会更改。计数器从1开始。

一个项目仅存在于数据点([[1],[1]])的索引0([1])和索引1([1])处,一旦ChartNum为2它将失败,因为什么也没有在那个索引上。

您应该执行this.datapoint [this.ChartNum-1]

那应该可以解决您的问题。

答案 1 :(得分:0)

您需要在推送之前初始化数组:

this.LabelList: [] = [];

由于声明数组时,其类型为undefined

let test: [];
console.log('typeof test is: ', typeof test);

更新

似乎您使用的不是数组,而是未定义的值。当您编写this.datapoint[this.ChartNum]时,表示您正在从数组中获取值。该值可以是对象,数组,值或未定义。尝试看看您拥有什么:

let yourValue = this.datapoint[this.ChartNum];
console.log(`yourValue: `, yourValue);

并在推入之前检查this.datapoint[this.ChartNum]是否为数组。例如:

if (this.datapoint[this.ChartNum] && this.datapoint[this.ChartNum].legnth) {
    this.datapoint[this.ChartNum].push(this.Classyaverage)
}

答案 2 :(得分:0)

您可以将值推送到this.datapoint.push()之类的数组,但是如果该调用未返回数组或未定义,则无法推送到this.datapoint[someNumber]。然后您最终呼叫的是undefined.push(),这是行不通的。

我不太了解为什么我们首先将值推入内部数组,然后对数组执行移位。为什么不做更直接的事情?另外,由于我们处于for循环中,因此最好定义新变量而不是更改类变量。像这样:

  public graphGenerator() {
    for (let counter = 1; counter <= this.NumOfCharts; counter++) {

      const labelList = Array.from({length: this.ListNum}, _ => '');
      const chartName = this.ChartName.slice(0, -1) + counter;
      const datapoint = [this.Classyaverage]

      this.graphComponent.setGraph(datapoint, labelList, chartName, counter);

    }
  }