JS遍历嵌套JSON报错TypeError 无法读取undefined的orderTotal求助
问题描述
接口端点返回嵌套结构JSON响应,遍历数据集打印控制台值时前期运行正常,遍历到末尾抛出如下错误:
TypeError: Cannot read properties of undefined (reading 'orderTotal')
对应实现代码如下,经多轮资料查阅未定位问题根因:
function updateChart() { async function fetchData() { const url = '/admin/Dashboard/GetEvents'; const response = await fetch(url); const datapoints = await response.json(); console.log(datapoints); return datapoints; } fetchData().then(datapoints => { var orderTotal=0.0; for (let i = 0; i < datapoints.length; i++) { for (let j = 0; j <= datapoints[i].length; j++) { for (let k = 0; k < datapoints[i].length; k++) { orderTotal+=datapoints[j][k].orderTotal; } } console.log(orderTotal); console.log(j); console.log(k); } myChart.update(); }).catch(e => { console.log(e); }); }

问题根因
循环逻辑存在两处明确错误,直接导致访问不存在的数组下标,拿到undefined值后读取orderTotal属性触发报错:
- 第二层循环终止条件错误:数组合法下标范围为
0 ~ 数组长度-1,写法j <= datapoints[i].length会让j最终等于数组长度,该下标对应的元素本身就是undefined - 数组访问路径错误:三层循环的遍历维度为i对应最外层数组、j对应第二层数组、k对应最内层元素,但取值时写为
datapoints[j][k].orderTotal,完全跳过i维度,遍历逻辑和数据嵌套结构不匹配
修复参考
先确认接口返回的嵌套数据层级,再对应调整循环逻辑。以「最外层数组 -> 第二层分组数组 -> 携带orderTotal属性的元素对象」的三层结构为例,修复后代码如下:
fetchData().then(datapoints => { let orderTotal = 0.0; // 遍历最外层数组 for (let i = 0; i < datapoints.length; i++) { // 终止条件用<,避免越界,遍历第二层数组 for (let j = 0; j < datapoints[i].length; j++) { // 若第二层元素直接是业务对象,无需第三层k循环 // 取值时必须带上i层级,匹配嵌套结构 const currentTotal = datapoints[i][j]?.orderTotal ?? 0; orderTotal += currentTotal; } } console.log('累计orderTotal值:', orderTotal); myChart.update(); }).catch(e => { console.log(e); });
优化提示:如果接口返回数据存在字段缺失、空值等异常情况,可使用可选链?.和空值合并??做兜底处理,避免单条异常数据中断整个遍历流程
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

