Глубокое копирование js [дубликат]

359
24 февраля 2019, 20:40

На данный вопрос уже ответили:

  • Копирование объекта с последующим изменением [дубликат] 3 ответа

Никак не могу понять где я допустил ошибку... Я написал функцию, которая должна делать копии объектов/массивов,вот она :

function copy(arr,deep){
  if(arr instanceof Object){
      var arr1 = {};
  }else if(arr instanceof Array){
      var arr1 = [];
  }else{
      return arr;
  }
  for(let key in arr){
      arr1[key] = copy(arr[key],true);
  }
  if(!deep){ 
      return arr1;
  }   
}

Она должна копировать массив с 30 объектами, объекты имеют глубину примерно уровня на три(они также имеют и методы). После копирования этого массива, выходит одноуровневый массив с вложенными undefined. Где ошибка?

P. S. Незнаю нужно ли это кому, но вот рабочая версия:

function copy(arr){
if(arr.length){
    var arr1 = [];
}else if(typeof arr == "object"){
    var arr1 = {};
}else{
    return arr; 
}
for(let key in arr){
    if(typeof arr[key] == "function" || !arr[key].length || typeof arr[key] != "object")
        arr1[key] = arr[key];
    else 
        arr1[key] = copy(arr[key]);
}
return arr1;
}
Answer 1

В функции пропущено возвращение результата при deep == true и первом аргументе, являющимся массивом или объектом.

Еще. Посмотрите на пример кода - что он выводит в консоль.

var a = []; 
console.log(typeof a, a instanceof Array, a instanceof Object);

Answer 2

Самый незапарный способ глубокого копирования объектов:

const newObj = JSON.parse( JSON.stringify(obj) );

))

READ ALSO
Почему не инициализируется select fw - Materialize

Почему не инициализируется select fw - Materialize

Подскажите, почему не инициализируется select как в документации? Приходится полностью инициализировать Materialize используя костыль

160
Событие при наведении мыши на фигуру в canvas

Событие при наведении мыши на фигуру в canvas

В canvas нарисованы две фигуры, подскажите можно ли обрабатывать событие при наведении мыши на фигуру без использования сторонних библиотек...

222
Как вставить субтитры в mediaelement.js?

Как вставить субтитры в mediaelement.js?

Подскажите пожалуйста как вставить субтитры в видео с использованием mediaelementjs?

222