数组自动更改值
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 = rows
到
this.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);
....
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 = rows
到
this.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);