Почему переменная, скопировання при помощи slice() меняет своё значение?

код:
var array = [
  [-0.04, 0.01, 4],
  [-1.09, 9, 0],
  [8.1, 10.4, 7],
  [15, 6, 3]
];
log("original array");
array.forEach(function(item) {
  log("[" + item + "]")
});
var newArray = [];
newArray = array.slice();
log("copy array");
newArray.forEach(function(item) {
  log("[" + item + "]")
});
newArray.forEach(function(item) {
  item.splice(1, 1)
});
log("modified array");
newArray.forEach(function(item) {
  log("[" + item + "]")
});
log("original array");
array.forEach(function(item) {
  log("[" + item + "]")
});

результат:
original array
[-0.04,0.01,4]
[-1.09,9,0]
[8.1,10.4,7]
[15,6,3]
copy array
[-0.04,0.01,4]
[-1.09,9,0]
[8.1,10.4,7]
[15,6,3]
modified array
[-0.04,4]
[-1.09,0]
[8.1,7]
[15,3]
original array
[-0.04,4]
[-1.09,0]
[8.1,7]
[15,3]

https://jsfiddle.net/Quncore/xrpo5kLb/

--
Спасибо за решение и за объяснение!
сделал следующим образом: var newArray = array.map(function(item){return item.slice()})
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
slice возвращает новый массив, тут вы правы, но вот deep copy он не делает. То есть если внутри массива у вас объект или массив - то slice вернет вам ссылку на объект из оригинального массива. Воспользуйтесь какой-нибудь библиотекой для deep copy. Ну или напишите свой костыль, который будет делать slice в цикле : )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Qwal Автор вопроса
Решил заменой
var newArray = [];
newArray = array.slice();

на
var newArray = new Array(array.length);
newArray = array.map(function(item){return item.slice()})

Так как это не многомерный массив, а массив с массивами, то slice() возвращал массив ссылок на подмассивы, а не их значения
Ответ написан
Ваш ответ на вопрос

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

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