【问题标题】:Array push overwrite all records of an array数组推送覆盖数组的所有记录
【发布时间】:2026-01-21 06:30:01
【问题描述】:

我正在尝试将数组推入另一个数组。数据正在填充父数组,但在填充记录后,它会覆盖父数组中的所有记录。在这里,我已经编写了我的代码。请指导我在哪里犯了错误?

这里我试图将 CSV 文件头值作为键和 CSV 文件记录作为值的模型。

let csvArr: any[] = [];
for (let i = 1; i < csvRecordsArray.length; i++) {
    let curruntRecord = (<string>csvRecordsArray[i]).split(',');
    if (curruntRecord.length == headerLength) {
           let headerRecord: {};
           headerRecord = this.headersRowData
           for(let j = 0; j < this.headersRowData.length; j++){
              headerRecord[this.headersRowData[j]] = curruntRecord[j].trim()
           }
           csvArr.push(csvRecord)
    }
}

HeaderRowData 将从 CSV 文件中读取标题,该文件是 any[] 的数组类型。

csvRecord 正在根据文件和循环获取正确的数据,但是当推入 csvArr 时,csvArr 中的所有现有记录都会覆盖那里。 那么这里如何解决这个覆盖问题呢?

【问题讨论】:

  • csvRecordsArray 中有哪些数据?
  • csvArr.push(csvRecord) 永远不应覆盖。在这段代码中看不到问题。这可能在函数内部吗?还有 let csvArr: any[] = [];?因为这只会在您每次调用函数时重置数组..?
  • @Blunderchips csvRecordsArray 是 CSV 文件的所有记录列表,没有第一行作为标题。
  • @MikeOne 是的,它在函数内部。但是该函数只调用一次。整个过程只在那里调用一次。唯一的循环是在我们调用该函数时处理那里的记录。
  • 您能否使用来自 csvRecordsArray、headerLength、headersRowData、csvRecord 的数据示例值/数据来更新您的问题。我什至看不到 csvRecord 是在哪里定义的。

标签: javascript arrays multidimensional-array


【解决方案1】:

您的代码中没有定义csvRecord,所以我假设您实际上是在将headerRecord 推送到数组中?

如果是这样,答案是显而易见的。你总是在分配

headerRecord = this.headersRowData;

它不会创建新对象,而只是将headerRecord 指定为对this.headerRowData 的附加引用。因此,它们都指向同一个内存位置。当你这样做时

csvArr.push(headerRecord);  //I assume this should be headerRecord

您只是向数组中添加了对同一个对象的附加引用。即数组的所有元素实际上都指向内存中的相同位置。 然后在循环体中更新headerRecord 对象。通过这次更新,您当然也更新了指向该对象的所有其他引用。因此,它似乎覆盖了许多元素。但实际上,它只是改变了一个元素,但所有其他元素也指向同一个元素,因此也反映了这些变化。

所以不是

let headerRecord: {};
headerRecord = this.headersRowData

只是做

let headerRecord = {};
//remove the assignment to this.headerRowData

// update the object here

csvArr.push(headerRecord);

这将在每次迭代中创建并添加一个新对象,该对象与其他对象无关...

【讨论】: