Ожидал другой результат от рекурсивного копирования свойств объекта

Сделал рекурсивное глубокое копирование по объекту. Но, объекты не идентичны друг другу, в оригинале у меня объект sizes, а в результате получил распарсенные данные обекта sizes, разве так и должно быть? Как получить результат 1 в 1 как в оригинале, но при этом чтоб объекты были разные?

Интересно именно решение с for in, за JSON.parse знаю

const user = {
  name: 'Igor',
  age: '26',
  sizes: {
    height: 182,
    width: 50,
  },
};


const admin = {}; // Создаем новый пустой объект

function cloneObj(obj) {

for (let key in obj) { // Перебираем все свойства копируемого объекта
  if (typeof obj[key] === 'object') { // Если свойство так же объект
    cloneObj(obj[key]);
  } else {
    admin[key] = obj[key]; // Или же просто копируем значение
  }
}
}

cloneObj(user);

console.log(user);
console.log(admin);


Ответы (1 шт):

Автор решения: Leonid

Рекурсивно можно возвращать объект из функции. А объект создаю в самой функции.

const user = {
  name: 'Igor',
  age: '26',
  sizes: {
    height: 182,
    width: 50,
  },
};


function cloneObj(obj) {
  let result = {}; // Создаем новый объект
  for (let key in obj) { // Перебираем все свойства копируемого объекта
    if (typeof obj[key] === 'object') { // Если свойство так же объект
      result[key] = cloneObj(obj[key]);
    } else {
      result[key] = obj[key]; // Или же просто копируем значение
    }
  }
  return result;
}

const admin = cloneObj(user);

console.log(user);
console.log(admin);

Но вряд ли вы получите глубокое копирование. Потому как тип объект и у массива, и у null, например.

const user = {
  name: 'Igor',
  age: '26',
  sizes: {
    height: 182,
    width: 50,
  },
  friends: [
    'Alex',
    'Maria'
  ],
  password: null
};


function cloneObj(obj) {
  let result = {}; // Создаем новый объект
  for (let key in obj) { // Перебираем все свойства копируемого объекта
    if (typeof obj[key] === 'object') { // Если свойство так же объект
      result[key] = cloneObj(obj[key]);
    } else {
      result[key] = obj[key]; // Или же просто копируем значение
    }
  }
  return result;
}

const admin = cloneObj(user);

console.log(user);
console.log(admin);
console.log(JSON.parse(JSON.stringify(user)));
console.log(Object.assign({},user));

→ Ссылка