Разрушающий объект в JS - вложенный объект

1

Как я могу обработать деструктурирование вложенного объекта, который может иметь неопределенный внутренний объект?

Например.

У меня есть 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);
Теги:
destructuring

3 ответа

2
Лучший ответ

Не могли бы вы просто использовать это?

const {user} = xhrResponse.person || {};

Для обновленного варианта использования я задаюсь вопросом, будет ли это жизнеспособным?

$q.all([
  somePromise,
  someOtherPromise,
  getPersonPromise.then(res => (res.person || {}).user)
]).then(promises => [vm.promise1, vm.promise2, vm.user] = promises);
  • 0
    Может работать, но мой вариант использования, который я пытаюсь исправить, не позволяет этого. Выше приведен надуманный пример, максимально приближенный к моей проблеме.
  • 0
    Не могли бы вы рассказать немного о дополнительных ограничениях, которые делают это нежизнеспособным? Линия, в которой вы делаете саму деструкцию, неизменна? Трудно вносить предложения, не зная, что я могу изменить в вашем первоначальном решении.
Показать ещё 8 комментариев
2

Вы также можете добавить значения по умолчанию для вложенных файлов:

const handleResponse = ({ person: { user = {}} = {}} = {}) => {
  console.log(user);
}

handleResponse({});

(я предполагаю, что вы используете es6 на основе ваших функций стрелок)

edit: sry, работает только с неопределенными значениями, но нет, если значение равно null, все равно оставит ответ здесь, поскольку он может быть полезен другим читателям

  • 0
    Таким образом, мы не можем сделать это присвоение значений по умолчанию без метода handleResponse?
  • 0
    нет, работает со всеми деконструкциями объектов, такими как const { person: { user = {}} = {}} = {}; console.log(user);
Показать ещё 1 комментарий
1

Лично мне нравится четко видеть параметры, которые получает моя функция.

Я пойду с этим решением:

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
}

Выполнение утомительной деструкции может закончиться нечитаемым кодом

Поэтому, делая прогрессивное деструктурирование, я чувствую, что это лучшее решение для меня.

  • 0
    Уверен, это вызовет ту же ошибку. Невозможно сравнить с «неопределенным» или «нулевым».
  • 0
    правда моя ошибка! Я обновлю это

Ещё вопросы

Сообщество Overcoder
Наверх
Меню