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

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

const alpha = { a: 'lower', b: '23.45' };
const { a: newA.toUpperCase(), b: parseFloat(floatB)}  = alpha;

Я знаю, что это неправильно, потому что здесь newA и floatB еще не определены.

Даже я пытался

const { a:a.toUpperCase(), b: parseFloat(b)} = alpha;

Но это тоже не работает

Итак, мой вопрос в том, как мы можем как-то достичь.

Или нам нужно сделать это позже, когда мы назначим новое имя переменной?


person diEcho    schedule 20.06.2019    source источник
comment
Только не используйте здесь деструктурирование. const newA = alpha.a.toUpperCase(), floatB = parseFloat(alpha.b); проще, короче и читабельнее.   -  person Bergi    schedule 20.06.2019
comment
это простой случай, который я объяснил в OP ... есть свойство deepdown, которое я хочу извлечь.   -  person diEcho    schedule 20.06.2019
comment
Возможно, вы захотите показать свой реальный случай тогда. Но все же это невозможно, вам понадобится дополнительный шаг после доступа к глубоким свойствам.   -  person Bergi    schedule 20.06.2019


Ответы (1)


Вы не можете сделать это одновременно. Несмотря на деструктуризацию, вы объявляете/создаете переменные. Пока вы создаете переменные, вы не можете выполнять функцию.

Итак, ШАГ 1 -> Деструктурируйте то, что вам нужно из альфы. ШАГ 2 -> выполнить нужные вам функции

person evedes    schedule 20.06.2019
comment
Но в целом мы можем выполнить функцию при создании переменных, например. `пусть x = b.toUpperCase()` - person diEcho; 20.06.2019
comment
это частный случай, когда вы добавляете/связываете .toUpperCase, потому что он существует в цепочке прототипов b. - person evedes; 20.06.2019
comment
Вы также можете деструктурировать методы из цепочки прототипов. Например, const a = [1,2,3,4] Теперь, если вы выполните { length } = a и console.log(a), вы получите 4. Опять же, потому что этот метод существует в цепочке прототипов. - person evedes; 20.06.2019
comment
значит a.prototype.toUpperCase(): newA будет работать! - person diEcho; 20.06.2019
comment
@evedes На самом деле length - это не метод прототипа (или геттер), а свойство экземпляра. - person Bergi; 20.06.2019
comment
Я полагаю, что при деструктурировании вы не можете этого сделать. Кроме того, это не очень хорошая практика. Делайте вещи настолько простыми и глупыми, насколько это возможно. В любом случае, если вы хотите глубже погрузиться в деструктуризацию, я оставляю вам эту ссылку: github.com/getify/You-Dont-Know-JS/blob/master/ от Кайла Симпсона. - person evedes; 20.06.2019
comment
Реальная история @bergi, извините за ошибку. Вот почему вы можете деструктурировать длину и записать значение. Не метод. - person evedes; 20.06.2019
comment
@evedes Хотя вы были правы, можно можно деструктурировать методы и унаследованные свойства - просто ваш пример не подходит. Скорее: const a = [1,2]; const { push } = a; push.call(a, 3); console.log(a); - person Bergi; 20.06.2019