数组推送覆盖数组的所有记录

kyvafyod  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(263)

我正在尝试将阵列推入另一个阵列。数据正在父数组中填充,但在填充记录之后,它将覆盖父数组中的所有记录。这里我已经写了我的代码。请告诉我哪里出错了?
在这里,我试图创建一个类似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文件中读取头,该文件是任意[]的数组类型。
csvrecord正在按照文件和循环获取正确的数据,但在推入csvarr时,csvarr中的所有现有记录都会被覆盖。那么如何解决这个覆盖问题呢?

llmtgqce

llmtgqce1#

没有 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);

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

相关问题