Параметры по умолчанию ES6 для обнуляемого вложенного объекта при деструктурировании - PullRequest
0 голосов
/ 01 марта 2019

У меня есть такой объект

const obj = {
  foo: {
    bar: { // maybe null
      id: 0
    }
  }
};

Я хочу деструктурировать obj, чтобы получить id.Если bar был только когда-либо undefined или объектом, этого было бы достаточно:

const {
        foo: {
          bar: {
            id,
          } = {},
        } = {},
      } = obj;

Но когда bar равно null, я получаю ошибку Cannot read property 'id' of null.

Я мог бы сделать это, предложил здесь

const {
        foo: {
          bar = {},
        } = {},
      }      = obj;
const { id } = bar || {};

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

Есть ли способ заставить инициализатор по умолчанию для объекта работать, если его значение равно нулю?

1 Ответ

0 голосов
/ 02 марта 2019

Вы можете сортировать оператора спреда.У вас будет не такой красивый синтаксис, как, но он работает:

const obj = {
  foo: {
    bar: null
  }
}

const id = {...{...{...obj}.foo}.bar}.id
// id = undefined

You can add an "or something" to the end to get a default value, like:
const id = {...{...{...obj}.foo}.bar}.id || 42
// id = 42

Принцип, как это работает, заключается в том, что если вы попытаетесь распространить неопределенное или нулевое значение, вы получите пустойobject:

console.log('spreaded null', { ...null })
// {}

console.log('spreaded undefined', { ...undefined })
// {}

Теперь, если вы обращаетесь к свойству, которое не определено для объекта, механизм JS вернет вам undefined, таким образом, вы можете распространить его, чтобы иметь еще один пустой объект для цепочкиследующее внутреннее свойство, к которому вам нужно получить доступ.

...