这种情况下如何保留原始数组?

问题描述 投票:0回答:1

当我console.log结果时,我得到原始数组已更改。我找不到为什么?我做了 slice().reverse() 来保存原始文件,但它不起作用。如果我编辑此代码,使其一维数组运行良好,并且原始数组不变。

let original = [["one", 1], ["two", 2], ["three", 3], ["four", 4], ["five", 5]];
let kopija = original.slice().reverse();

for (let i=0; i<5; i++){
    while(kopija[i][1] > 1){
        kopija[i][1]--     
    }    
}
console.log("kopija" + kopija)
console.log("original" + original)
arrays slice reverse
1个回答
0
投票

因为 slice() 创建了数组的浅表副本,这意味着它创建了一个新数组,但仍然引用相同的嵌套数组。因此,当您修改 kopijai-- 中的嵌套数组时,您也会修改原始中相应的嵌套数组,因为它们指向内存中的相同对象。

要解决您的问题,您可以使用诸如 map() 之类的方法为每个内部数组创建新数组。像这样的东西:

let original = [["one", 1], ["two", 2], ["three", 3], ["four", 4], ["five", 5]];

// Create a deep copy using map() to clone inner arrays
let kopija = original.map(arr => [...arr]).reverse();

for (let i = 0; i < 5; i++) {
    while (kopija[i][1] > 1) {
        kopija[i][1]--;
    }
}

console.log("kopija: ", kopija);
console.log("original: ", original);

通过这样做,原始数组将保持不变,因为“kopija”包含嵌套数组的深层副本,而不仅仅是对它们的引用。

© www.soinside.com 2019 - 2024. All rights reserved.