Typescript数组push操作偶现元素丢失问题求助
数组元素丢失问题排查与修复
问题根源
- 误操作全局数组:处理当前文件临时数据
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消失的直接原因。
- 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
相关产品推荐
相关产品推荐

