Добавление свойств в объект JavaScript по условию: приемы

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

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

Для добавления свойств в объект в JavaScript условно, используйте оператор расширения (...) совместно с синтаксисом литерала объекта:

JS
Скопировать код
const hasSuperPowers = true;
const hero = {
  name: 'Супермен',
  ...(hasSuperPowers && { power: 'Полёт' })  // Зависимость добавления "power" от значения hasSuperPowers
};

Также есть возможность использовать стандартный условный оператор if для добавления элементов в уже существующий объект:

JS
Скопировать код
let hero = { name: 'Бэтмен' };
if (hasSuperPowers) hero.power = 'Гениальный интеллект';  // Не забываем про его сложный характер
Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Защита целостности объекта

Для сохранения консистентности объекта, проверяйте, не содержит ли рассматриваемое свойство значений undefined или других недопустимых. Это особенно важно при работе с данными из внешних источников, например, API или ввода пользователя:

JS
Скопировать код
let hero = { name: 'Робин' };
const power = fetchHeroPower('Робин');  // Эта функция обнаруживает скрытые способности Найтвинга...

// Свойство "power" добавляем только если оно определено
if (power !== undefined) hero.power = power;

Масштабирование с множеством условных свойств

Когда требуется добавить несколько условных свойств, сочетайте операторы расширения:

JS
Скопировать код
const canFly = true, hasMoney = false;

const hero = {
  name: 'Человек-паук',
  ...(canFly && { power1: 'Полёт' }),
  ...(hasMoney && { power2: 'Богатство' }) // О, Человек-паук, у тебя не повезло с богатством
};

// В объекте hero появятся "name" и "power1" (полёт), в то время как "power2" не появится

Такой подход повышает читаемость и надёжность кода.

Условные свойства с использованием Object.assign()

Метод Object.assign() эффективно помогает при добавлении условных свойств:

JS
Скопировать код
const canFly = true;

const hero = Object.assign(
  { name: 'Росомаха' },
  canFly ? { power: 'Полёт' } : null
);
// Росомаха не обладает способностью к полёту... по крайней мере, без помощи Air Canada

Этот метод подойдет для сложных ситуаций, например, когда значения получаются из различных источников.

Подход jQuery к условным свойствам

Для предпочитающих jQuery есть метод $.extend(), представляющий простое решение:

JS
Скопировать код
const canFly = true;
const hero = $.extend(
  { name: 'Флэш' },
  canFly && { power: 'Полёт' }  // Флэш, попробуй догнать самолёт, если сможешь!
);

Метод функционирует аналогично оператору расширения, но в контексте jQuery.

Чистые объекты с использованием краткого замыкания

Оператор логического И (&&) способствует предотвращению наличия ненужных свойств в объектах:

JS
Скопировать код
const canFly = false;

const hero = {
  name: 'Аквамен',
  ...canFly && { power: 'Полёт' }  // Аквамен, как здесь подняться в воздух?
};

Логическое И гарантирует добавление свойств только при точном выполнении условия.

Создание динамичных объектов при помощи условных свойств

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

JS
Скопировать код
const settings = { name: fetchHeroName() };

const hero = {
  ...settings,
  ...(isHeroHuman() && { weakness: 'Смертная жизнь'})   // Исключением будут лишь Тор и Киану Ривз
};

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

Представьте, что вы составляете список участников секретного собрания супергероев. Не всем участникам дано преимущество "бессмертие" (конечно, кроме Тора и Нео):

JS
Скопировать код
let meetupInvite = {
  heroName: 'Человек-паук',
  date: '2022-10-31',
  secretBase: 'Башня Мстителей'
  // О бессмертии пока ничего не говорим
};

const isImmortal = findOutIfImmortal();
if (isImmortal) {
  meetupInvite.immortality = true;  // Бессмертие гарантировано, пока только Зелёный Гоблин не вмешается
}

Вот как выглядит приглашение:

Markdown
Скопировать код
Без бессмертия: [🕷️, 📅, 🏰]
С бессмертием (если обладает бессмертием): [🕷️, 📅, 🏰, ∞]

И вот наш Человек-паук получает условное бессмертие в свою коллекцию геройских привилегий!

Предотвращение загрязнения объекта свойствами с проверками на undefined

Сложная структура данных может иногда приводить к значению undefined:

JS
Скопировать код
const heroAttributes = fetchHeroAttributesFromAPI();
const hero = {
  name: heroAttributes.name,
  ...(heroAttributes.age > 21 && { drinkingAge: true })
};
// Добавляем свойство "drinkingAge", только если возраст героя превышает 21 и задан

Такой подход гарантирует "чистоту" объектов и способствует поддержанию точности данных на высоком уровне.

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

  1. Условный (тернарный) оператор – JavaScript | MDN — подробное описание условных операторов в JavaScript.
  2. Оператор расширения (...) – JavaScript | MDN — глубокое изучение оператора расширения в JavaScript.
  3. Выражения и операторы – JavaScript | MDN — подробное описание операторов в JavaScript.
  4. Объекты JavaScript – W3Schools — отличное руководство по ключевым аспектам объектов в JavaScript.
  5. Как я могу добавить пару ключ/значение к объекту JavaScript? – Stack Overflow — глубокие обсуждения на тему свойств, JavaScript и объектов на Stack Overflow.
  6. Object.defineProperty() – JavaScript | MDN — подробности о создании новых свойств объекта.
  7. Опциональные цепочки (?.) – JavaScript | MDN — основы применения оператора опциональной цепочки в JavaScript.