Изменить переменную локально, но не глобально
Мне нужно сохранить копию глобальной переменной массива, в то время как я изменяю ее локально. По какой-то причине приведенный ниже код, похоже, не делает этого.
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
3 ответа
Вам нужно сделать глубокое копирование этого массива, потому что сейчас плитки и tileArray указывают на один и тот же кусок памяти (ссылка). Вы можете сделать это с tileArray = Arrays.from(плитки)
Вот полезная статья: https://medium.com/@gamshan001/javascript-deep-copy-for-array-and-object-97e3d4bc401a
Посмотрите на этот вопрос
Чтобы клонировать массив, попробуйте что-то вроде:
var dup_array = original_array.slice();
Но обратите внимание, что они говорят о том, что это мелкая копия.
По сути, tileArray ссылается на тот же массив, вместо того, чтобы создавать для этого копию,
Используйте:
tileArray = tiles.slice()
slice (), операция клонирует массив и возвращает ссылку