Node.js: сравните свойство вложенного объекта, которое может не существовать

Моя проблема

Рассмотрим сравнение вложенного свойства объекта:

display.entities.listAfter.text === 'blah';

Если одно из свойств во вложенном поиске не существует, мы получим ошибку типа, например:

TypeError: Cannot read property 'listAfter' of undefined

Что я пробовал

Попробуй поймать. Работает, но не очень элегантно, и мне интересно, есть ли способ лучше.

Мое мнение

Есть ли канонический способ - помимо попытки поймать - проверить, существует ли вложенное свойство, прежде чем проводить сравнение?

Возможный дубликат Проверить наличие вложенного ключа объекта JavaScript

Félix Paradis 13.09.2018 21:20
1
1
237
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Не знаю насчет канонического, но иногда делаю так:

display.entities &&
display.entities.listAfter &&
display.entities.listAfter.text === 'blah'

Но, конечно, это довольно быстро становится громоздким. Если вы действительно хотите, чтобы он выглядел красиво, обратитесь к lodash!

https://lodash.com/docs/4.17.10#get

Вы можете указать путь к функции .get и даже указать значение по умолчанию, если оно не найдено.

_.get(display, 'entities.listAfter.text') === 'blah'

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

const getValue = (obj = {}, path = []) => {
  return path.reduce((xs, x) => (xs && xs[x]) ? xs[x] : undefined, obj);
};

const display = {
  "entities": {
    "listAfter": {
      "text": 1
    }
  }
};
console.log(getValue(display, ['entities', 'listAfter', 'text']));
console.log(getValue(display, ['entities', 'listAfter', 'foo']));
console.log(getValue(display, ['entities', 'listAfter']));

Другие вопросы по теме