Node.js从数组文本提取订单日期与总额报错求助
订单数据提取问题分析与修复
问题场景
现有订单JSON数据及读取代码:
let rawdata = fs.readFileSync('test.json'); let orders = JSON.parse(rawdata);
原始JSON数据:
[{"order":["Awaiting delivery","Order date: Dec 18, 2022","Order ID: 11111111","Copy","Order details","store name","product name","1, 1","US $1.73x1","Total: US $5.39","Confirm receipt","Track order"]},{"order":["Awaiting delivery","Order date: Dec 18, 2022","Order ID: 2222222","Copy","Order details","store name_2","5","items","Total: US $13.07","Confirm receipt","Track order"]}]
编写提取订单日期、ID、店铺名和总额的代码后,报错TypeError: Cannot read properties of undefined (reading 'includes'),且无法正确获取订单总额:
orders.forEach(element => { let order_date = element.order[1].replace('Order date:', '') let order_ID = element.order[2].replace('Order ID:', '') let store_name = element.order[5] for (i=0; i<15; i++) { if (element.order[i].includes('Total')) { let order_total = element.order[i] } } console.log(order_date + "*" + order_ID + "*" + store_name + "*" + order_total) });
预期输出:
Dec 18, 2022*11111111*store name*Total: US $5.39 Dec 18, 2022*2222222*store name_2*Total: US $13.07
问题原因
- 数组越界访问:循环条件设为
i<15,但实际每个order数组的长度仅为11或12,当i超过数组最大索引时,element.order[i]返回undefined,调用includes()方法就会触发报错。 - 变量作用域错误:
order_total在for循环的if块内用let声明,属于块级作用域,外部的console.log无法访问该变量,会输出undefined。 - 方法使用错误:JavaScript字符串没有
contains()方法,正确的包含判断方法是includes()。
修复方案
方案1:修正循环逻辑与作用域
orders.forEach(element => { let order_date = element.order[1].replace('Order date:', '').trim(); // 去除多余空格 let order_ID = element.order[2].replace('Order ID:', '').trim(); let store_name = element.order[5]; let order_total = ''; // 提前声明变量,扩大作用域 // 循环到数组实际长度,避免越界 for (let i = 0; i < element.order.length; i++) { if (element.order[i].includes('Total')) { order_total = element.order[i]; break; // 找到目标后直接跳出循环,提升效率 } } console.log(`${order_date}*${order_ID}*${store_name}*${order_total}`); });
方案2:使用数组find方法简化代码
利用数组的find()方法直接匹配包含"Total"的元素,代码更简洁:
orders.forEach(element => { let order_date = element.order[1].replace('Order date:', '').trim(); let order_ID = element.order[2].replace('Order ID:', '').trim(); let store_name = element.order[5]; let order_total = element.order.find(item => item.includes('Total')); console.log(`${order_date}*${order_ID}*${store_name}*${order_total}`); });
内容的提问来源于stack exchange,提问作者Lord
相关产品推荐
相关产品推荐

