Изменить переменную локально, но не глобально - PullRequest
0 голосов
/ 21 декабря 2018

Мне нужно сохранить копию глобальной переменной массива, в то время как я изменяю ее локально.По какой-то причине приведенный ниже код, похоже, не делает этого.

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 ]

0 голосов
/ 21 декабря 2018

Посмотрите на этот вопрос

Чтобы клонировать массив, попробуйте что-то вроде:

var dup_array = original_array.slice();

Но обратите внимание, что они говорят о том, что это мелкая копия.

0 голосов
/ 21 декабря 2018

Вам нужно сделать глубокое копирование этого массива, потому что сейчас tile и tileArray указывают на один и тот же кусок памяти (ссылка).Вы можете сделать это с tileArray = Arrays.from (плитки)

Вот полезная статья: https://medium.com/@gamshan001/javascript-deep-copy-for-array-and-object-97e3d4bc401a

0 голосов
/ 21 декабря 2018

Как правило, tileArray ссылается на тот же массив, вместо создания копии для этого,

Использование:

tileArray = tiles.slice()

slice (), операция клонирует массив и возвращает ссылку

...