Функция, изменяющая глобальную переменную
У меня есть этот массив, который я передаю в функцию, которая должна повернуть массив на 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 ответа
Так что вы правы - Array.reverse()
метод, используемый в функции rotate, не возвращает новый массив, он модифицирует тот же ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse);
Я бы предложил изменить функцию rotate, чтобы сначала клонировать переданный ей массив, и только потом выполнять Array.reverse()
так далее..
Вы можете клонировать этот простой массив, переданный в функцию rotate в вашем примере, используя let newMatrix = JSON.parse(JSON.stringify(matrix));
Затем выполните оставшиеся действия на newMatrix
и вернуть это вместо.
Если вам не нравится этот подход, вы также можете создать новый пустой массив и, используя двойной цикл for (цикл внутри цикла, когда вы работаете с 2D-сетками), заполнить новый массив значениями из исходного.
Да, ваши 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;
}