我有一個代碼片段如下
let arr1 = [{status : true , name : "one"} , {status : false , name : "two"} , {status : true , name : "three"}]
let arr2 = arr1.slice();
for(let i=0; i<arr2.length ; i ){
if(!arr2[i].status){
arr2[i].status = true;
}
}
console.log("arr1....." , arr1);
console.log("arr2......",arr2)
在這種情況下,arr1 和 arr2 都被修改了。我的預期結果只是更新 arr2 而不是 arr1 (僅使用簡單的 for 回圈)
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
陣列中的物件指向相同的參考,因此如果您更新其中的物件,arr2則會更新arr1. 所以你有2個選擇,
arr1分配時深復制arr2(深復制意味著復制內部的物件,可能運行速度較慢)
let arr1 = [{status : true , name : "one"} , {status : false , name : "two"} , {status : true , name : "three"}]
let arr2 = JSON.parse(JSON.stringify(arr1));
for(let i=0; i<arr2.length ; i ){
if(!arr2[i].status){
arr2[i].status = !arr2[i].status;
}
}
console.log("arr1....." , arr1);
console.log("arr2......",arr2)
- 復制物件(您想更改),添加更改欄位如下
let arr1 = [{status : true , name : "one"} , {status : false , name : "two"} , {status : true , name : "three"}]
let arr2 = [...arr1];
for(let i=0; i<arr2.length ; i ){
if(!arr2[i].status){
arr2[i] = {...arr2[i], status:!arr2[i].status};
}
}
console.log("arr1....." , arr1);
console.log("arr2......",arr2)
uj5u.com熱心網友回復:
如何更改復制陣列的方式?
要解釋為什么slice()會使它們都更新,那是因為 array.slice() 還復制了原始陣列的參考。
因此,每當原始陣列發生變化時,復制的陣列也會發生變化
let arr1 = [{status : true , name : "one"} , {status : false , name : "two"} , {status : true , name : "three"}]
const arr2 = JSON.parse(JSON.stringify(arr1));
for(let i=0; i<arr2.length ; i ){
if(!arr2[i].status){
arr2[i].status = true;
}
}
console.log("arr1....." , arr1);
console.log("arr2......",arr2)
uj5u.com熱心網友回復:
您正在創建一個新陣列,但其中的物件仍在參考原始陣列。您需要為這些物件創建新的參考。使用以下內容而不是let arr2 = arr1.slice();@Tuba Polat 提到的“深度復制”方法。
let arr2 = arr1.map(oldObj => { return { ...oldObj } })
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/451265.html
標籤:javascript
