Функция, изменяющая глобальную переменную - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть этот массив, который я передаю в функцию, которая должна повернуть массив на 90 градусов и вернуть результат.Затем я хочу проверить, не сталкивается ли новый массив с другими объектами на холсте.

let newArray = [
[0,0,1],
[1,1,1],   
[0,0,0]
];

let test = rotate(newArray);

if ( collision(test) ){
  draw(newArray);
} else {
  draw(test);
}

Вот проблема.Я думаю, что rotate () изменяет переменную newArray, поэтому не имеет значения, что вычисляет оператор if, функция draw () всегда будет делать то же самое.

Я хочу выбрать массив дляНарисуйте после проверки, если повернутая матрица сталкивается с другими вещами.

function rotate(matrix) {

matrix = matrix.reverse();

for (var i = 0; i < matrix.length; i++) {
 for (var j = 0; j < i; j++) {
  var temp = matrix[i][j];
  matrix[i][j] = matrix[j][i];
  matrix[j][i] = temp;
 }
}
return matrix
}


function collision(mat){

let collision = false;

for ( let i = 0; i < mat.length; i++){
for ( let j = 0; j < mat.length; j++){
  if (mat[i][j] == 1){
    let test = ctx.getImageData(x + 10*j +10, y + 10*i, 1, 1);
      if (test.data != "255,255,255,255" && test.data != "0,0,0,0"){
        collision = true;
      }
  }
 }
 }
return collision;
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Да, ваша rotate функция изменяет ваш массив, поэтому не имеет значения, в какое предложение if входит. Измените это на это, потому что вы должны клонировать свою матрицу.

function rotate(matrix) {

    newNatrix = matrix.slice().map( function(row){ return row.slice(); });

    for (var i = 0; i < newNatrix.length; i++) {
        for (var j = 0; j < i; j++) {
            var temp = newNatrix[i][j];
            newNatrix[i][j] = newNatrix[j][i];
            newNatrix[j][i] = temp;
        }
    }
    return newNatrix;
}
0 голосов
/ 14 сентября 2018

Итак, вы правы - метод Array.reverse(), используемый в функции rotate, не возвращает новый массив, он модифицирует тот же (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse);

Я бы предложил изменить функцию вращения, чтобы сначала клонировать переданный ей массив, и только потом выполнять Array.reverse() и т. Д.

Вы можете клонировать этот простой массив, переданный в функцию поворота в вашем примере, используя let newMatrix = JSON.parse(JSON.stringify(matrix)); Затем выполните оставшиеся действия с newMatrix и верните его вместо этого.

Если вам не нравится этот подход, вы можете также создать новый пустой массив и, используя двойной цикл for (цикл внутри цикла, когда вы работаете с 2D-сетками), заполнить новый массив значениями из исходного .

...