Node.js: сравнить свойство вложенного объекта, которое может не существовать - PullRequest
0 голосов
/ 13 сентября 2018

Моя проблема

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

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

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

TypeError: Cannot read property 'listAfter' of undefined

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

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

My Wuestion

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

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

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

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']));
0 голосов
/ 13 сентября 2018

Я не знаю о каноническом, но иногда буду делать это:

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'
...