无法读取未定义的属性“ xxxx”

时间:2019-09-04 15:33:43

标签: javascript chart.js

嗨,我是一名学生,我从开发开始。我尝试使用chart.js制作直方图。 x是星期数,y是总和。为此,我编写此代码

function sumWeek(data) {
  var week = new Date(data[0].dateHisto).getWeek();
  var month = new Date(data[0].dateHisto).getMonth();
  var year = new Date(data[0].dateHisto).getFullYear();
  var table = [0, year, month, week];
  var sum = 0;
  for (var i = 0; i < data.length; i++) {
    sum += parseInt(data[i].energy) / 1000;
  }

table.splice(0, 1, sum);
tableWeek.push(table);
}
for (k = 1; k <= 52; k++) {
  var resultW = dataH.filter(function(data) {
    var date = new Date(data.dateHisto);
    return date.getWeek() == k;
  });
  sumWeek(resultW);
}

我的问题:当一个星期没有数据时,控制台会写

index.php?page=history_currently:11606 Uncaught TypeError: Cannot read property 'dateHisto' of undefined
at sumWeek (index.php?page=history_currently:11606)
at createHistoWeek (index.php?page=history_currently:11640)
at index.php?page=history_currently:11414

编辑09/05:我不好,我没有很好地解释。暂时,一个星期没有数据,因此返回空的     [] 当我有数据时,我有     {energy: "19530", dateHisto: "2019-01-28"} 当数据为空时,该功能不起作用,并返回未捕获的typeError。而目前我还没有找到解决方案^^ Ty作为答案

2 个答案:

答案 0 :(得分:0)

在代码的第二行中,将第一个元素从“数据”数组中取出。 如果数组为空或未定义,则没有第一个元素可以使用属性“ dateHisto”。

因此,您可以在函数的第一行中添加以检查是否收到任何输入。

if(!data || data.length < 1){
  return
}

最好(!)的方法是在调用函数(!)之前检查是否有任何输入。

答案 1 :(得分:0)

2个选项:

否。 1:

以下行中的data.dateHistovar date = new Date(data.dateHisto);未定义

否。 2:

以下代码上的resultW

var resultW = dataH.filter(function(data) {
    var date = new Date(data.dateHisto);
    return date.getWeek() == k;
});

是一个包含单个或多个不具有dateHisto属性的元素的数组,或者包含它但其值为undefined