@Vasek1999

Почему изменяется массив в функции?

Добрый день! Возник вопрос с функцией, которая должна принимать на вход матрицу 3*3, и возвращать матрицу, из которой удалены i-я строка и j-й столбец. Разумеется, исходная матрица изменяться не должна.

Матрица задана как массив такого рода:
A=[[11,12,13],
[21,22,23],
[31,32,33]]

Написал такую функцию:

function delete_from_matrix (matrix, string_number, column_number) {
		
		matrix.splice(string_number,1);
   
		for (i = 0; i < 2; i++){
			matrix[i].splice(column_number, 1);
		};
	return matrix;	
	};


Однако при вызове функции выясняется, что она изменяет сам массив А. Т.е. при записи:

Temp = delete_from_matrix (A, 0, 1);

получается, что матрица А изменяется: до вызова A.length = 3, после вызова A.length = 2.

Насколько я понимаю, такого быть не должно, так как читал, что при вызове функции ведётся работа с копиями переданных параметров. Однако же это происходит :( Подскажите, пожалуйста, в чём ошибка?

При этом даже если ввести новый параметр Temp и внутри функции написать, что Temp = A, то изменение А происходит всё равно.
  • Вопрос задан
  • 513 просмотров
Решения вопроса 3
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Вы передаете массив по ссылке в функцию, и меняете его там, поэтому он меняется. Внутри функции используйте slice, или клонируйте свою матрицу.
UPD: вот реализация без этой проблемы.
var rowNumber = 0;
var colNumber = 1;
var x = A.filter(function (val, ind) {
   return ind !== rowNumber;
}).map(function (val) {
   return val.filter(function (val, ind) {
       return ind !== colNumber;
    });
});
Ответ написан
@afanasiyz
Javascript-разработчик
Любые не-примитивы в js передаются всегда по ссылке (массив один из них).
Поэтому, чтобы не изменялся входящий массив, его надо склонировать.
Меня тут наверное поправят, но по-моему в чистом js нет удобных способов склонировать вложенный массив без хаков, а хак тут будет:

let Temp = JSON.parse(JSON.stringify(matrix));

Или можно использовать lodash и его deepClone
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы