Как деструктурировать вложенный объект с нулевым значением, используя значение по умолчанию - PullRequest
3 голосов
/ 13 мая 2019

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

Я достиг этого путем деструктуризации в несколько этапов, но лучше сделать это в один этап, если это возможно.

const obj = { a: null };
const { a: { b, c } = {} } = obj;

Это приводит к ошибке:
Cannot destructure property 'b' of 'undefined' or 'null'

Я бы ожидал, что b и c будут undefined

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Чтобы использовать значение по умолчанию , значение, которое вы разрушаете, должно быть undefined.

const obj = { a: undefined };
const { a: { b, c } = {} } = obj;

console.log(b, c)
0 голосов
/ 13 мая 2019

Ваш код выглядит следующим образом после перехода :

var obj = { a: null };
var _obj$a = obj.a;
_obj$a = _obj$a === void 0 ? {} : _obj$a;
var b = _obj$a.b,
    c = _obj$a.c;

Здесь _obj$a - временная переменная, ссылающаяся на obj.a. Если указано значение по умолчанию, оно будет проверять это значение только против void 0 (или undefined), а не против null

Вы можете все еще делать это, используя деструктуризацию. Но традиционные проверки null и undefined гораздо проще понять.

let obj = { a: null },
  a = obj.a,
  b, c;

if (typeof a !== "undefined" && a !== null) {
  b = obj.a.b;
  c = obj.a.b;
}
0 голосов
/ 13 мая 2019

Вы можете изменить null на пустой объект во временном объекте.Используя map() в записях объекта, измените null на пустой объект {}, а затем преобразуйте его в объект, используя Object.fromEntries

const obj = { a: null };
const { a: { b, c } = {} } = Object.fromEntries(Object.entries(obj).map(x => x[1] === null ? {} : x));

console.log(b,c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...