Клонирование объекта JavaScript без одного ключа: метод ES6/ES7

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы скопировать объект JavaScript, исключив при этом определенное свойство, можно воспользоваться оператором деструктуризации:

JS
Скопировать код
const { keyToRemove, ...clonedObject } = originalObject;

В конечном счете clonedObject будет содержать все свойства исходного объекта originalObject, исключая keyToRemove.

Кинга Идем в IT: пошаговый план для смены профессии

Подробнее об копировании объектов с исключением свойств

Существуют различные способы клонирования объектов, выбор которых зависит от конкретных требований.

Удаление динамического свойства

Если требуется исключить переменную с ключом, необходимо предпринять небольшую корректировку:

JS
Скопировать код
let keyToSkip = 'unwantedKey'; // Ключ для удаления
const { [keyToSkip]: _, ...clonedObject } = originalObject;
// Используем заполнитель _, чтобы удовлетворить требования линтера

Глубокое копирование для вложенных объектов

Для сложных структур с вложенными объектами рекомендуется использовать функции вроде deepOmit:

JS
Скопировать код
const deepOmit = (obj, unwantedKey) => {
  return Object.entries(obj).reduce((acc, [key, value]) => {
    if (key === unwantedKey) return acc; // Игнорируем нежелательный ключ
    acc[key] = value instanceof Object ? deepOmit(value, unwantedKey) : value;
    return acc;
  }, {});
};
// Не забывайте о рекурсии и её вычислительной нагрузке. Функция не обрабатывает массивы и объекты-даты, поэтому будьте внимательны.

Использование библиотек

Если применение современного ECMAScript невозможно, могут помочь такие библиотеки, как Lodash или Ramda:

JS
Скопировать код
const _ = require('lodash');
const clonedObject = _.omit(originalObject, 'keyToRemove');

Не забывайте об важности размера пакетов в приложении.

Визуализация

Можно уподобить этот процесс паковке чемодана, из которого следует исключить определенный предмет:

Markdown
Скопировать код
Исходный чемодан (🎒): [📱, 👖, 🕶️, 🎧, 📘]

Если не брать с собой солнцезащитные очки (🕶️):

JS
Скопировать код
let clonedBag = {...originalBag};
delete clonedBag['sunglasses']; // Кажется, мы едем в Сиэтл!

В итоге получается новый состав:

Markdown
Скопировать код
Новый чемодан (🛄): [📱, 👖, 🎧, 📘]  
// Солнцезащитные очки? Мы ведь не планируем их использовать!

Всё готово, и чемодан скопирован без лишней вещи! 🚀

Обзор способов клонирования

Производительность при копировании больших объектов

В случае с очень большими объектами иногда предпочтительнее использовать Object.assign():

JS
Скопировать код
const clonedObject = Object.assign({}, originalObject);
delete clonedObject[keyToRemove];

Удаление с помощью Undefined и оператора Delete

Присвоение undefined не полностью удаляет ключ:

JS
Скопировать код
const clonedObject = {...originalObject, [keyToRemove]: undefined};
// Ключ keyToRemove всё ещё виден, как призрачное отражение в клонированном объекте.

Именно такие особенности могут стать неприятными сюрпризами при работе с ключами объектов.

Учет специфических случаев

  • Неперечисляемые свойства — это своего рода ниндзя среди свойств объектов, их клонирование требует особого подхода.
  • Свойства-символы — они не копируются стандартными методами и для их обработки требуется индивидуальный подход.

Полезные материалы

  1. Оператор расширения (...) – JavaScript | MDN — описание оператора расширения для клонирования объектов.
  2. Оператор деструктурирующего присваивания – JavaScript | MDN — проработка тонкостей деструктуризации.
  3. Как наиболее эффективно выполнить глубокое клонирование объекта в JavaScript? – Stack Overflow — обсуждения по вопросу глубокого клонирования объектов.
  4. Object.assign() – JavaScript | MDN — анализ клонирования и объединения объектов с помощью Object.assign().
  5. Immutable Update Patterns | Redux — рекомендации по иммутабельному клонированию без некоторых ключей.
  6. Ссылки на объекты и их копирование — подробное объяснение процессов копирования объектов в JavaScript.