Угловой ngrx: проверка наличия поля в объекте - PullRequest
0 голосов
/ 17 декабря 2018

Извините, если это дублирование какого-либо вопроса, однако я не могу найти решение своей проблемы.

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

export const getSingleValue = createSelector(
    getEntities,
    (entities) => entities
        .map(item => {
            // need to check is field and oneMoreField, etc. exist
           return item.field.oneMoreField.andMoreField.andHereIs.value || null; 
        })
);

План B - перенос, возвращающийся к try-catch, но я думаю, что это не очень хороший вариант.

1 Ответ

0 голосов
/ 17 декабря 2018

Typescript не поддерживает оператор Элвиса "из коробки".

Итак, некоторые из ваших вариантов:

Вручную проверьте, есть ли свойство, например:

if(item && item.field && item.field.oneMoreField)
  return item.field.oneMoreField;

// or    
return item && item.field && item.field.oneMoreField;

Используйте прокси-объект:

function safe(obj) {
  return new Proxy(obj, {
    get: function(target, name) {
      const result = target[name];
      if (!!result) {
        return (result instanceof Object)? safe(result) : result;
      }
      return safe({});
    }
  });
}
return safe(item.field.oneMoreField);

Или с библиотекой, такой как Lodash:

_.get(item, 'field.oneMoreField')
...