Ошибка: не удается прочитать свойство «push» из неопределенного - PullRequest
0 голосов
/ 02 июля 2019

Я создаю цикл for, который генерирует графики.Проблема, с которой я столкнулся, заключается в том, что я помещаю свой сценарий генерации графа в цикл for в перерывах, сообщая мне сообщение об ошибке «Не удается прочитать свойство« push »из неопределенного для массива datapoint. Однако код работает вне цикла 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 ]

1 голос
/ 03 июля 2019

Когда он выходит из цикла for, ChartNum равен 1, то есть элемент в datapoint существует по этому индексу (вторая запись в datapoint, он начинается с 0), и поэтому вы можете нажать на него.

Когда вы помещаете его в цикл for, ChartNum равен счетчику, который меняется на каждой итерации.Счетчик начинается с 1.

Элемент существует только с индексом 0 ([1]) и индексом 1 ([1]) в точке данных ([[1], [1]]), как только ChartNumравен 2, он потерпит неудачу, так как в этом индексе ничего нет.

Вы должны сделать это.datapoint [this.ChartNum - 1]

Это должно решить вашу проблему.

0 голосов
/ 03 июля 2019

Вы можете помещать значения в массив, например, 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);

    }
  }
0 голосов
/ 02 июля 2019

Вам нужно инициализировать ваш массив перед нажатием:

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