Почему получение «Деструктурирующих выражений может иметь только ссылки на идентификаторы» при попытке уничтожить объект?

#javascript #json #object #destructuring

#javascript #json #объект #деструктурирование

Вопрос:

У меня есть следующий объект:

 const john = {
  family: [
    { firstName: 'david', secondName: 'jana' },
    { firstName: 'eyal', secondName: 'shani ' },
  ],
};
 

Я хочу получить строку ‘david’ за одну операцию. Итак, я попробовал следующий код:

 const { family:[0]{firstName}}} = john;
 

Но я получаю сообщение об ошибке :

«Деструктурирующие выражения могут иметь только ссылки на идентификаторы»

Может кто-нибудь сказать мне простыми словами (потому что я новичок в языке), что я делаю не так?

Комментарии:

1. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

Ответ №1:

Чтобы извлечь глубоко вложенное значение с помощью деструктурирования, синтаксис почти идентичен синтаксису при объявлении объекта с этими свойствами. family:[0] недопустимый синтаксис — вместо этого вам нужно окружить содержимое family в разделителях массива:

 const john = {
  family: [{
      firstName: 'david',
      secondName: 'jana'
    },
    {
      firstName: 'eyal',
      secondName: 'shani '
    },
  ],
};

const { family:[{firstName}]} = john;

console.log(firstName); 

Но я бы настоятельно не рекомендовал использовать вложенную деструктуризацию подобным образом. Это так трудно писать, читать и понимать. Лучше использовать обычную точечную нотацию, по крайней мере, для внешнего доступа, например

 const john = {
  family: [{
      firstName: 'david',
      secondName: 'jana'
    },
    {
      firstName: 'eyal',
      secondName: 'shani '
    },
  ],
};

const { firstName } = john.family[0];
console.log(firstName); 

Комментарии:

1. прежде всего, спасибо! Во-вторых, почему { family:[{FirstName}]} переходит к первому элементу массива, а не ко второму элементу?

2. Потому {} что это первый элемент внутри [] скобок. Если бы вы это сделали [, { firstName }] , вы бы извлекали данные из второго элемента массива.