使用$getJSON和ChartJS创建图表时提取数据出现undefined错误如何解决
问题原因
- 内层循环条件错误:你当前内层循环的判断条件为
j < i,完全不符合遍历delays子数组的逻辑,正确逻辑应该是遍历每个外层元素对应的delays数组的全部元素,循环条件应为j < data[i].delays.length。原写法会触发两种异常:i=0时内层循环完全不执行,i≥1时如果delays数组长度小于i,就会访问到不存在的数组元素,触发undefined报错。 - 数据类型未做兼容:你提供的JSON中
Arrival字段存在字符串类型的值(比如"3"、"no information"),如果直接传入ChartJS作为Y轴数值会导致渲染异常,需要额外做合法性校验和类型转换。
正确实现代码
var dataPoints = []; function addData(data) { // 清空原有数据,避免重复请求时数据叠加 dataPoints = []; for (var i = 0; i < data.length; i++) { // 取当前外层元素对应的delays子数组 var delayList = data[i].delays; // 内层循环遍历整个delays子数组 for (var j = 0; j < delayList.length; j++) { var currentItem = delayList[j]; // 转换Arrival为数值类型,过滤非法值 var arrivalVal = Number(currentItem.Arrival); if (!isNaN(arrivalVal)) { dataPoints.push({ x: currentItem.Station, y: arrivalVal }); } // 若需保留无到站信息的站点,可替换上面的判断逻辑为: // y: isNaN(arrivalVal) ? null : arrivalVal } } console.log(dataPoints); chart.render(); } $.getJSON(url, addData);
补充说明
如果需要保留Arrival为no information的站点,调整校验逻辑将非法值设为null即可,ChartJS会自动跳过该点渲染或按配置展示为空。所有字符串格式的数字会被统一转为数值类型,避免Y轴出现字符串排序异常的问题。
内容的提问来源于stack exchange,提问作者sppokky
相关产品推荐
相关产品推荐

