Вопрос или проблема
Предположим, у вас есть очень большой json -> объект, такой как
const cc = stuff.galaxies[13].stars[2099].planets["Jingo"].cities
Я смешал как массивы, так и именованные json.
Конечно, некоторого элемента может не быть по пути.
Я, как правило, делаю так:
const cc = stuff.galaxies?[13]?.stars?[2099]?.planets?["Jingo"]?.cities ?? null
Это, похоже, работает, в результате чего cc будет (в этом примере) массивом “городов”, или null. (Без “undefined”).
Или другой пример может быть таким:
const j = stuff.galaxies?[13]?.stars?[2099]?.planets?["Jingo"] ?? null
Это правильно? Спасибо. Довольно сложно знать все детали опциональных свойств в Node, если вы не являетесь настоящим экспертом по Node.
Да, ваше использование опциональной цепочки (?.
) и операторов объединения с нулем (??
) правильно!
Опциональная цепочка позволяет вам безопасно получать доступ к глубоко вложенным свойствам, не сталкиваясь с ошибками, если какая-либо часть цепочки undefined
или null
. Если какая-либо часть отсутствует, возвращается undefined
, а оператор объединения с нулем затем гарантирует, что если результат undefined
, то cc
(или j
) будет установлен в null
.
Так что в ваших примерах:
const cc = stuff.galaxies?.[13]?.stars?.[2099]?.planets?.["Jingo"]?.cities ?? null;
const j = stuff.galaxies?.[13]?.stars?.[2099]?.planets?.["Jingo"] ?? null;
Оба будут работать так, как вы планировали. Если какое-либо свойство будет отсутствовать, cc
или j
будет null
, что предотвращает возникновение значений undefined
. Это делает ваш код намного более безопасным и чистым при работе со сложными вложенными структурами!
Ответ или решение
Да, ваше использование опциональной цепочки (оператора ?.
) и оператора нулевого слияния (оператора ??
) абсолютно корректно!
Опциональная цепочка позволяет безопасно получать доступ к глубоко вложенным свойствам, не сталкиваясь с ошибками, если какая-либо часть цепочки является undefined
или null
. Если на каком-то уровне отсутствует значение, оператор ?.
вернет undefined
, а оператор нулевого слияния затем обеспечит, чтобы если результат был undefined
, переменные cc
или j
были присвоены значение null
.
В ваших примерах:
const cc = stuff.galaxies?.[13]?.stars?.[2099]?.planets?.["Jingo"]?.cities ?? null;
const j = stuff.galaxies?.[13]?.stars?.[2099]?.planets?.["Jingo"] ?? null;
Оба варианта будут работать так, как вы задумали. Если любое свойство в цепочке будет отсутствовать, то cc
или j
будут равны null
, что позволяет избежать любых значений undefined
. Это значительно улучшает безопасность и читаемость вашего кода при работе с глубоко вложенными структурами данных.
Таким образом, подход, который вы используете, обеспечивает надежность и аккуратность кода, особенно при работе с большими и сложными JSON-объектами, где вероятность отсутствующих значений высока.