从数组中子对象提取数据时返回undefined的问题求助
问题分析与修复
你的代码核心问题是没有正确引用数组transactionLines的索引,导致无法访问到数组内的具体元素,从而返回undefined。具体错误点和修复方案如下:
错误点梳理
- 内层循环中,直接通过
input[i].transactionLines.lineId访问属性,但transactionLines是数组,必须通过索引[j]定位到具体元素后才能读取其属性。 - 计算总额时,错误使用了
input[i].lineValue,这个属性在顶层对象中不存在,应该取transactionLines数组对应元素的lineValue。 - 日志输出里的
input[i].transactionLines.transactionId同样缺少索引,无法获取正确的交易ID值。
修正后的代码
///Dummy JSON Data Stringified and put in the top ///////// const inputData= "[{\r\n\t\t\"transaction\": 1,\r\n\t\t\"store\": 1,\r\n\t\t\"transactionLines\": [{\r\n\t\t\t\t\"transactionId\": 1,\r\n\t\t\t\t\"lineId\": 3,\r\n\t\t\t\t\"lineValue\": 25\r\n\t\t\t},\r\n\r\n\t\t\t{\r\n\t\t\t\t\"transactionId\": 1,\r\n\t\t\t\t\"lineId\": 2,\r\n\t\t\t\t\"lineValue\": 50\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"transactionId\": 1,\r\n\t\t\t\t\"lineId\": 1,\r\n\t\t\t\t\"lineValue\": 100\r\n\t\t\t}\r\n\t\t]\r\n\t},\r\n\t{\r\n\t\t\"transaction\": 2,\r\n\t\t\"store\": 2,\r\n\t\t\"transactionLines\": [{\r\n\t\t\t\t\"transactionId\": 1,\r\n\t\t\t\t\"lineId\": 2,\r\n\t\t\t\t\"lineValue\": 50\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"transactionId\": 1,\r\n\t\t\t\t\"lineId\": 1,\r\n\t\t\t\t\"lineValue\": 100\r\n\t\t\t}\r\n\t\t]\r\n\t}\r\n]" const input = JSON.parse(inputData); var total = 0; ////// First "For Loop" goes through input data ///// ////// and lists transactions /////////////////////// for(let i=0;i<input.length;i++){ console.log(input[i].transaction); ///////// 2nd "For Loop" is inside the transaction loop. //////// ///////// This goes through transaction data from the above loop / ///////// and lists transactions /////////////////////////////// for(let j=0;j<input[i].transactionLines.length;j++){ // 获取当前循环的交易明细项 const lineItem = input[i].transactionLines[j]; // 累加lineValue到总额 total += lineItem.lineValue; // 输出当前lineId console.log(lineItem.lineId); // 输出交易ID和更新后的总额 console.log(`Transaction ID = ${input[i].transaction} loop x ${j}: New Total = ${total}`); } }
关键修改说明
- 新增
const lineItem = input[i].transactionLines[j];,通过索引j定位到具体的交易明细元素,简化后续代码的可读性。 - 总额计算改为
total += lineItem.lineValue;,正确引用明细项的lineValue属性。 - 所有访问
transactionLines内属性的操作,都改为通过lineItem(或直接input[i].transactionLines[j])获取,确保能访问到数组内的具体元素。
内容的提问来源于stack exchange,提问作者Sparx
相关产品推荐
相关产品推荐

