Я только что обнаружил восхитительный синтаксис деструкции ES6 для списков, т.е.
ls = [1, 2, 3]
[first, ...rest] = ls
который устанавливает first
1
и rest
в [2,3]
. Однако можно ли разбить список на rest=[1,2]
и last=3
с использованием аналогичного синтаксиса?
Мне не повезло. Я пробовал некоторые очевидные догадки для такого синтаксиса (см. Ниже), но все они порождали синтаксические ошибки.
[rest..., last] = ls
[...rest, last] = ls
Полагаю, я мог бы сделать это, дважды изменив список, поэтому альтернативное решение моего вопроса будет постоянной функцией разворачивания временного списка.
То, что обычно называется "деструктурирование массива", фактически разрушает итерабельность, из которых массив является особым случаем. Дело в том, что они могут быть бесконечными или "ленивыми". Вот почему вы не можете разрушить какое-то количество элементов, за которыми следует последний:
const [...first, last] = integers();
поскольку integers
могут быть
function* integers() {
let n = 0;
while (true) yield n++;
}
и что тогда будет last
быть?
Нет, это работает только на концевых элементах массива. Итак, как вы сказали, они способ достичь того, что вы хотите, будут сначала обращать внимание на массив.
На всякий случай, если вы не сталкивались с подобным шаблоном для объекта, есть один:
const {a, ...rest} = {a: "prop1", b: "prop2", c: "prop3"}
Отличным инструментом для тестирования всех этих новых функций является https://babeljs.io/repl
rest
с итерацией, но строго заполняет массив.