Как я могу обработать деструктурирование вложенного объекта, который может иметь неопределенный внутренний объект?
Например.
У меня есть xhr req, который возвращает {person: user: {}}
Например: const xhrResponse = {person: user: 'hi'}}
Меня интересует только часть пользователя, поэтому я разрушаю.
const {person: {user}} = xhrResponse
console.log(user) => 'hi'
Однако что, если api возвращает {person: null}
Мое деструктурирование завершается неудачно. Cannot match against 'undefined' or 'null'.
У меня есть решение, но я чувствую, что может быть более элегантное решение.
Решение
const handleResponse(res) => res.person? res: {person: user: {}}
Есть ли лучший способ справиться с этим? Или даже по-другому, использование слова лучше иногда ассоциируется с мнением: D
Более полный вариант использования:
$q.all([somePromise, someOtherPromise, getPersonPromise])
.then(promises => [vm.promise1, vm.promise2, {person: {user: vm.user}] = promises);
Не могли бы вы просто использовать это?
const {user} = xhrResponse.person || {};
Для обновленного варианта использования я задаюсь вопросом, будет ли это жизнеспособным?
$q.all([
somePromise,
someOtherPromise,
getPersonPromise.then(res => (res.person || {}).user)
]).then(promises => [vm.promise1, vm.promise2, vm.user] = promises);
Вы также можете добавить значения по умолчанию для вложенных файлов:
const handleResponse = ({ person: { user = {}} = {}} = {}) => {
console.log(user);
}
handleResponse({});
(я предполагаю, что вы используете es6 на основе ваших функций стрелок)
edit: sry, работает только с неопределенными значениями, но нет, если значение равно null, все равно оставит ответ здесь, поскольку он может быть полезен другим читателям
const { person: { user = {}} = {}} = {}; console.log(user);
Лично мне нравится четко видеть параметры, которые получает моя функция.
Я пойду с этим решением:
const handleResponse = (response) => {
const { person: { user } = {} } = response || {};
// since user is the value to be used you don't need to set a default unless you need it
if (user) // do your stuff here
}
Выполнение утомительной деструкции может закончиться нечитаемым кодом
Поэтому, делая прогрессивное деструктурирование, я чувствую, что это лучшее решение для меня.