数组自动更改值

Array change the values automatically

....
import * as XLSX from 'xlsx';
...

我正在 Ionic 4 中读取 .xlsx 文件

showData() {
  let fileReader = new FileReader();
  fileReader.onloadend = (e) => {
    this.arrayBuffer = fileReader.result;
    let data = new Uint8Array(this.arrayBuffer);
    let arr = new Array();
    for (let i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
    let bstr = arr.join("");
    let  workbook = XLSX.read(bstr, { type: "binary" });
    let first_sheet_name = workbook.SheetNames[0];
    let worksheet = workbook.Sheets[first_sheet_name];
    let rows = XLSX.utils.sheet_to_json<Income>(worksheet, { raw: true });

    this.allIncomesFromDocument = rows 
    this.Test(rows)    
  }
  fileReader.readAsArrayBuffer(this.file);
}

Test(rows){
  this.allIncomesFromDocument.forEach( v => console.log(v.quantity) ) // FIRST LOG

  rows.forEach( row =>{
    row.quantity = 0;
  })

  this.allIncomesFromDocument.forEach( v => console.log(v.quantity) ) // SECCOND LOG
}

在第一个日志中我有

8
7
5
9
2
etc.

我在文件中的数据

但我从不更改值,只重复相同的 forEache 和我拥有的日志

0
0
0
ect.

日志完全不同

当你这样做的时候 this.allIncomesFromDocument = rows 您实际上是在分配 reference 而不是 copying 数据。

这意味着当你这样做的时候 row.quantity = 0; 您正在更新 reference,这是两个变量。

如果你改变 this.allIncomesFromDocument = rowsthis.allIncomesFromDocument = JSON.parse(JSON.stringify(rows)) 您将创建数据的完整副本,而不仅仅是分配引用。

你必须分配两个数组.. 并且其中一个数组必须使用 Object.assign 来防止原始对象的突变。例如:

var rows = [{quantity: 1},{quantity: 2},{quantity: 3}];

var allIncome = rows;

let newIncome = rows.map(row => {
  let newRow = Object.assign({}, row);
  newRow.quantity = 0;
  return newRow;
});

console.log(allIncome);
console.log(newIncome);