Почему смещение массива в массиве влияет на скопированные (не по ссылке) массивы, а смещение всего исходного массива - нет? (Javascript) - PullRequest
1 голос
/ 08 июля 2019

Я пытаюсь сместить массив и использовать этот массив, а затем установить его в исходные значения, используя скопированный массив, который был скопирован не по ссылке.По некоторым причинам смещение массивов из исходного массива не влияет на скопированный массив, но смещение элементов из массивов в исходном массиве влияет на скопированный массив.Как мне скопировать массив, изменить его, использовать его, а затем вернуть его в исходную форму?

У меня изначально были проблемы, потому что я копировал по ссылке, но потом я узнал, что использование оператора rest позволиломне скопировать массив (не по ссылке).Кажется, эти две привязки все еще связаны.

var m = [[1,2,3],[4,5,6],[7,8,9]]
var matrix = [...m]
m.shift();
console.log(matrix);
m[0].shift();
console.log(m);
console.log(matrix);

Ожидается:

[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
[ [ 5, 6 ], [ 7, 8, 9 ] ]
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]

Фактически:

[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
[ [ 5, 6 ], [ 7, 8, 9 ] ]
[ [ 1, 2, 3 ], [ 5, 6 ], [ 7, 8, 9 ] ]

1 Ответ

1 голос
/ 08 июля 2019

Проблема в том, что массивы второй степени все еще передаются по ссылке, когда вы делаете [...m].Я не уверен, как вы все еще могли бы использовать оператор rest, но вы могли бы сделать следующее:

var matrix = JSON.parse(JSON.stringify(m));

, чтобы избежать проблемы.

var m = [[1,2,3],[4,5,6],[7,8,9]];

var matrix = JSON.parse(JSON.stringify(m));

m.shift();
console.log(matrix);
m[0].shift();
console.log(m);
console.log(matrix);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...