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

Typescript数组push操作偶现元素丢失问题求助

数组元素丢失问题排查与修复

问题根源

  1. 误操作全局数组:处理当前文件临时数据tmpData时,错误地对全局data数组执行了splice操作。这段逻辑完全偏离预期:
tmpData.forEach((item, index) => {
    if (Object.entries(item).length < 2) {
        data.splice(index, 1); // 此处应操作tmpData,而非全局data数组
    }
});

比如处理第二个文件(PaloAlto)时,若tmpData索引0的元素符合删除条件,会直接删掉data数组的第一个元素(即之前推入的Ciena),这就是第三轮输出中Ciena消失的直接原因。

  1. forEach修改数组的隐患:即便操作的是tmpData,用forEach结合splice也会因数组长度变化导致索引偏移,部分符合条件的元素可能漏删。

修复代码

用filter替代错误的splice操作,既不会误触全局数组,也能避免索引偏移问题:

for (const k of raw) {
    let columns: Column[] = []
    let tmpData: any[] = []

    // 读取Excel文件数据
    const wb = read(await k.file.arrayBuffer(), {
        sheets: k.type.sheet
    })
    tmpData = utils.sheet_to_json(wb.Sheets[k.type.sheet], {
        range: k.type.row
    })

    // 修复:用filter过滤tmpData,保留有效元素
    tmpData = tmpData.filter(item => Object.entries(item).length >= 2);
    
    // 删除含EMPTY的键
    tmpData.forEach((item) => {
        Object.keys(item).forEach((key) => {
            if (key.includes('EMPTY')) {
                delete item[key]
            }
        })
    })

    // 提取列信息(增加空数组判断避免报错)
    if (tmpData.length > 0) {
        Object.keys(tmpData[0]).forEach((key) => {
            columns.push(new Column(key, key, 'input', true, 300))
        })
    }
    columnsObject.push(new ColumnsType(columns, k.type.name))
    // 将当前文件数据推入全局数组
    data.push(new TablesType(tmpData, k.type.name))

    // 调试输出
    data.forEach(item => {
        console.log(item.vendor)
    })
    console.log('\n ----- \n')
}

额外优化建议

  • 变量命名尽量区分层级,比如把全局data改为uploadedTableList,避免和临时数据混淆
  • 对tmpData[0]的访问增加空数组判断,防止空文件导致的报错

内容的提问来源于stack exchange,提问作者memphisten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:35:18