Sobes.tech
Назад к вопросам
Middle+
3

Как можно копировать Map/Set и объекты? Поверхностное и глубокое копирование.

Компании, где спрашивали
М.Видео/эльдорадо

Ответ от нейросети

sobes.tech AI

Для копирования Map, Set и объектов в JavaScript существуют методы поверхностного и глубокого копирования.

Поверхностное копирование:

  • Для объектов можно использовать Object.assign({}, obj) или оператор расширения {...obj}. Это копирует только первый уровень свойств, вложенные объекты остаются ссылками.
  • Для Map и Set можно создать новый экземпляр с передачей исходного в конструктор:
    const newMap = new Map(oldMap);
    const newSet = new Set(oldSet);
    
    Это создаст новый Map/Set с теми же элементами, но элементы сами не копируются глубоко.

Глубокое копирование:

  • Для объектов можно использовать рекурсивную функцию, которая копирует вложенные объекты и массивы.
  • Для Map и Set нужно рекурсивно копировать их элементы, если они сами являются объектами.

Пример глубокой копии объекта с Map и Set:

function deepCopy(value) {
  if (value instanceof Map) {
    const copiedMap = new Map();
    for (const [key, val] of value.entries()) {
      copiedMap.set(key, deepCopy(val));
    }
    return copiedMap;
  }
  if (value instanceof Set) {
    const copiedSet = new Set();
    for (const val of value.values()) {
      copiedSet.add(deepCopy(val));
    }
    return copiedSet;
  }
  if (Array.isArray(value)) {
    return value.map(deepCopy);
  }
  if (value && typeof value === 'object') {
    const copiedObj = {};
    for (const key in value) {
      if (value.hasOwnProperty(key)) {
        copiedObj[key] = deepCopy(value[key]);
      }
    }
    return copiedObj;
  }
  return value; // примитивы
}

Таким образом, поверхностное копирование копирует только верхний уровень, а глубокое — все вложенные структуры.