局部修改变量,但不全局修改



我需要保存一个全局设置的数组变量的副本,同时在本地修改它。出于某种原因,下面的代码似乎无法做到这一点。

var tileArray;
.
.
.
function simplify (tiles){
tileArray = tiles;  //tileArray is the global variable passed to simplify()
for (var i = 0; i < tiles.length; i++){
if (tiles[i].numeratorDim == ""){tiles[i].numeratorDim = 1};
if (tiles[i].denominatorDim == ""){tiles[i].denominatorDim = 1};
};
while (thereIsAMatch(tiles)){ // a bunch of code modifying tiles, but not tileArray
for (var i = 0; i < tiles.length; i++){
for (var j = 0; j < tiles.length; j ++) {
if (unitsMatch(tiles[i].numeratorUnit, tiles[j].denominatorUnit)) {
tiles[i].numeratorDim = parseInt(tiles[i].numeratorDim) - 1; 
if (tiles[i].numeratorDim == 0){tiles[i].numeratorUnit = ""}
tiles[j].denominatorDim = parseInt(tiles[j].denominatorDim) - 1;
if (tiles[j].denominatorDim == 0){tiles[j].denominatorUnit = ""}
} // if unitsMatch
} // for j
} //for i
} //while thereIsAMatch
console.log(tileArray === tiles);  //returns TRUE!! But tileArray hasnt been modified!!
return tiles;
} // function simplify

您需要对此数组进行深度复制,因为现在tile和tileArray指向同一块内存(引用(。您可以使用tileArray=Array.from(tiles(来完成此操作

以下是一篇有用的文章:https://medium.com/@gamshan001/javascript-deep-copy-for-array-and-object-97e3d4bc401a

基本上,tileArray指的是同一个数组,而不是为此创建一个副本,

用途:

tileArray = tiles.slice()

slice((,操作克隆数组并返回引用

看看这个问题

要克隆阵列,请尝试以下操作:

var dup_array = original_array.slice();

但请注意,他们说这是一个肤浅的复制品。

最新更新