Как проверить наличие у глубокого свойства родительского свойства в объекте?

Иногда приходится писать вот такого формата условия: if (campaign.budget.bills.type) {}, но бывает, что одно из родительских свойств от type может быть null и, если это так, здесь будет ошибка.
А если есть возможность, что каждое родительское свойство может быть null?

Придется проверять сначала "самое родительское", потом заходить глубже и глубже, получив вот такую проверку:
if (campaign && campaign.budget && campaign.budget.bills && campaign.budget.bills.type) {}

Довольно неприятный код.

Где-то в памяти у меня лежит мутное знание, что это все можно сократить, поставив `?` рядом со свойством, но вставив его и перед, и после свойства - всегда получалась ошибка. Может это вообще из другого языка - я не помню.

Так есть ли возможность более коротким кодом проверять всю цепочку свойств?
  • Вопрос задан
  • 207 просмотров
Решения вопроса 2
RAX7
@RAX7
в черновиках следующего стандарта есть Optional Chaining
obj?.prop         // optional property access
obj?.[expr]       // ditto
func?.(...args)   // optional function or method call
new C?.(...args)  // optional constructor invocation

Через babel можно использовать уже сейчас https://babeljs.io/docs/en/babel-plugin-proposal-o... , правда я сам не пробовал
Ответ написан
@StockholmSyndrome
можно написать функцию, проверяющую свойства
function checkProps(obj, props) {
  if (!obj) return false; 
  let value = obj; 
  for (let i = 0, l = props.length; i < l; i++) {
    value = value[props[i]];
    if (value == null) return false;
  }
  return true;
}

if (checkProps(campaign, ['budget', 'bills', 'type'])) {}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы