You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题原因

  1. 数组越界访问:循环条件设为i<15,但实际每个order数组的长度仅为11或12,当i超过数组最大索引时,element.order[i]返回undefined,调用includes()方法就会触发报错。
  2. 变量作用域错误:order_total在for循环的if块内用let声明,属于块级作用域,外部的console.log无法访问该变量,会输出undefined。
  3. 方法使用错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:45:38