JavaScript ES6: разделить массив на покой и завершить с деструктуризацией [дубликаты]

1

Я только что обнаружил восхитительный синтаксис деструкции ES6 для списков, т.е.

ls = [1, 2, 3]

[first, ...rest] = ls

который устанавливает first 1 и rest в [2,3]. Однако можно ли разбить список на rest=[1,2] и last=3 с использованием аналогичного синтаксиса?

Мне не повезло. Я пробовал некоторые очевидные догадки для такого синтаксиса (см. Ниже), но все они порождали синтаксические ошибки.

[rest..., last] = ls
[...rest, last] = ls

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

Теги:
ecmascript-6
arrays
destructuring

2 ответа

3

То, что обычно называется "деструктурирование массива", фактически разрушает итерабельность, из которых массив является особым случаем. Дело в том, что они могут быть бесконечными или "ленивыми". Вот почему вы не можете разрушить какое-то количество элементов, за которыми следует последний:

const [...first, last] = integers();

поскольку integers могут быть

function* integers() {
  let n = 0;
  while (true) yield n++;
}

и что тогда будет last быть?

  • 0
    Это должно быть названо повторяемой деструкцией с самого начала. Хорошее объяснение!
  • 1
    Там нет теоретической проблемы с фиксированным количеством целей назначения после шаблона массива. Обратите внимание, что бесконечная итерация никогда не прекращает деструктуризацию даже с шаблоном отдыха, так как она не лениво инициализирует rest с итерацией, но строго заполняет массив.
0

Нет, это работает только на концевых элементах массива. Итак, как вы сказали, они способ достичь того, что вы хотите, будут сначала обращать внимание на массив.

На всякий случай, если вы не сталкивались с подобным шаблоном для объекта, есть один:

const {a, ...rest} = {a: "prop1", b: "prop2", c: "prop3"}

Отличным инструментом для тестирования всех этих новых функций является https://babeljs.io/repl

  • 0
    Да, но почему это не поддерживается?

Ещё вопросы

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