Разрушение для получения последнего элемента массива в es6
В coffeescript это просто:
coffee> a = ['a', 'b', 'program']
[ 'a', 'b', 'program' ]
coffee> [_..., b] = a
[ 'a', 'b', 'program' ]
coffee> b
'program'
Разрешает ли es6 что-то подобное?
> const [, b] = [1, 2, 3]
'use strict'
> b // it got the second element, not the last one!
2
> const [...butLast, last] = [1, 2, 3]
SyntaxError: repl: Unexpected token (1:17)
> 1 | const [...butLast, last] = [1, 2, 3]
| ^
at Parser.pp.raise (C:\Users\user\AppData\Roaming\npm\node_modules\babel\node_modules\babel-core\node_modules\babylon\lib\parser\location.js:24:13)
Конечно, я могу сделать это способом es5 -
const a = b[b.length - 1]
Но, возможно, это немного подвержено ошибкам. Может ли splat быть последним в деструктурировании?
Ответы
Ответ 1
Это невозможно в ES6/2015. Стандарт просто не предусматривает этого.
Как вы можете видеть в спецификации, FormalParameterList
может быть:
-
FunctionRestParameter
-
FormalsList
(список параметров) -
FormalsList
, сопровождаемый FunctionRestParameter
Наличие FunctionRestParameter
за которым следуют параметры, не предоставляется.
Ответ 2
console.log('last', [1, 3, 4, 5].slice(-1));
console.log('second_to_last', [1, 3, 4, 5].slice(-2));
Ответ 3
Я полагаю, что ES6 может хотя бы помочь с этим:
[...arr].pop()
Учитывая, что ваш массив (arr) не является неопределенным и является итеративным элементом (да, даже строки работают !!), он должен вернуть последний элемент.. даже для пустого массива, и он также не изменит его. Это создает промежуточный массив, хотя.. но это не должно стоить дорого.
Ваш пример будет выглядеть так:
console.log( [...['a', 'b', 'program']].pop() );
Ответ 4
Вы можете разрушить обратный массив, чтобы приблизиться к тому, что вы хотите.
const [a, ...rest] = ['a', 'b', 'program'].reverse();
document.body.innerHTML =
"<pre>"
+ "a: " + JSON.stringify(a) + "\n\n"
+ "rest: " + JSON.stringify(rest.reverse())
+ "</pre>";
Ответ 5
Не обязательно самый эффективный способ сделать. Но в зависимости от контекста довольно элегантный способ будет выглядеть так:
const myArray = ['one', 'two', 'three'];
const theOneIWant = [...myArray].pop();
console.log(theOneIWant); // 'three'
console.log(myArray.length); //3
Ответ 6
const arr = ['a', 'b', 'c']; // => [ 'a', 'b', 'c' ]
const {
[arr.length - 1]: last
} = arr;
console.log(last); // => 'c'
Ответ 7
Это должно работать:
const [lastone] = myArray.slice(-1);
Ответ 8
Вы можете попробовать это взломать:
let a = ['a', 'b', 'program'];
let [last] = a.reverse();
a.reverse();
console.log(last);