Клонирование объекта JavaScript без одного ключа: метод ES6/ES7
Быстрый ответ
Для того чтобы скопировать объект JavaScript, исключив при этом определенное свойство, можно воспользоваться оператором деструктуризации:
const { keyToRemove, ...clonedObject } = originalObject;
В конечном счете clonedObject
будет содержать все свойства исходного объекта originalObject
, исключая keyToRemove
.
Подробнее об копировании объектов с исключением свойств
Существуют различные способы клонирования объектов, выбор которых зависит от конкретных требований.
Удаление динамического свойства
Если требуется исключить переменную с ключом, необходимо предпринять небольшую корректировку:
let keyToSkip = 'unwantedKey'; // Ключ для удаления
const { [keyToSkip]: _, ...clonedObject } = originalObject;
// Используем заполнитель _, чтобы удовлетворить требования линтера
Глубокое копирование для вложенных объектов
Для сложных структур с вложенными объектами рекомендуется использовать функции вроде deepOmit
:
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:
const _ = require('lodash');
const clonedObject = _.omit(originalObject, 'keyToRemove');
Не забывайте об важности размера пакетов в приложении.
Визуализация
Можно уподобить этот процесс паковке чемодана, из которого следует исключить определенный предмет:
Исходный чемодан (🎒): [📱, 👖, 🕶️, 🎧, 📘]
Если не брать с собой солнцезащитные очки (🕶️):
let clonedBag = {...originalBag};
delete clonedBag['sunglasses']; // Кажется, мы едем в Сиэтл!
В итоге получается новый состав:
Новый чемодан (🛄): [📱, 👖, 🎧, 📘]
// Солнцезащитные очки? Мы ведь не планируем их использовать!
Всё готово, и чемодан скопирован без лишней вещи! 🚀
Обзор способов клонирования
Производительность при копировании больших объектов
В случае с очень большими объектами иногда предпочтительнее использовать Object.assign()
:
const clonedObject = Object.assign({}, originalObject);
delete clonedObject[keyToRemove];
Удаление с помощью Undefined и оператора Delete
Присвоение undefined
не полностью удаляет ключ:
const clonedObject = {...originalObject, [keyToRemove]: undefined};
// Ключ keyToRemove всё ещё виден, как призрачное отражение в клонированном объекте.
Именно такие особенности могут стать неприятными сюрпризами при работе с ключами объектов.
Учет специфических случаев
- Неперечисляемые свойства — это своего рода ниндзя среди свойств объектов, их клонирование требует особого подхода.
- Свойства-символы — они не копируются стандартными методами и для их обработки требуется индивидуальный подход.
Полезные материалы
- Оператор расширения (...) – JavaScript | MDN — описание оператора расширения для клонирования объектов.
- Оператор деструктурирующего присваивания – JavaScript | MDN — проработка тонкостей деструктуризации.
- Как наиболее эффективно выполнить глубокое клонирование объекта в JavaScript? – Stack Overflow — обсуждения по вопросу глубокого клонирования объектов.
- Object.assign() – JavaScript | MDN — анализ клонирования и объединения объектов с помощью
Object.assign()
. - Immutable Update Patterns | Redux — рекомендации по иммутабельному клонированию без некоторых ключей.
- Ссылки на объекты и их копирование — подробное объяснение процессов копирования объектов в JavaScript.