我正在创建一个生成图形的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);
}
答案 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);
}
}