ecmascript 6 - them - Desestructuración para obtener el último elemento de una matriz en es6
spread operator javascript (7)
En coffeescript esto es sencillo:
coffee> a = [''a'', ''b'', ''program'']
[ ''a'', ''b'', ''program'' ]
coffee> [_..., b] = a
[ ''a'', ''b'', ''program'' ]
coffee> b
''program''
¿Es6 permite algo similar?
> 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)
Por supuesto que puedo hacerlo de la manera es5:
const a = b[b.length - 1]
Pero tal vez esto sea un poco propenso a errores de uno. ¿Puede el splat ser lo último en la desestructuración?
Creo que ES6 al menos podría ayudar con eso:
[...arr].pop()
Dado que su matriz (arr) no está indefinida y es un elemento iterable (sí, ¡incluso las cadenas funcionan!), Debería devolver el último elemento ... incluso para la matriz vacía y tampoco la altera. Sin embargo, crea una matriz intermedia ... pero eso no debería costar mucho.
Su ejemplo se vería así:
[...[''a'', ''b'', ''program'']].pop() -> ''program''
Esto debería funcionar:
const [lastone] = myArray.slice(-1);
No es necesariamente la forma más eficaz de hacer. Pero dependiendo del contexto, una forma bastante elegante sería:
const myArray = [''one'',''two'',''three''];
const theOneIWant = [...myArray].pop();
console.log(theOneIWant); // ''three''
console.log(myArray.length); //3
No es posible en ES6 / 2015. El estándar simplemente no lo prevé.
Como puede ver en
la especificación
,
FormalParameterList
puede ser:
-
un
FunctionRestParameter
-
una lista
FormalsList
(una lista de parámetros) -
una lista
FormalsList
, seguida de unFormalsList
FunctionRestParameter
No se proporciona
FunctionRestParameter
seguido de parámetros.
Puede desestructurar la matriz invertida para acercarse a lo que desea.
const [a, ...rest] = [''a'', ''b'', ''program''].reverse();
document.body.innerHTML =
"<pre>"
+ "a: " + JSON.stringify(a) + "/n/n"
+ "rest: " + JSON.stringify(rest.reverse())
+ "</pre>";
const [last] = [1, 3, 4, 5].slice(-1)
const [second_to_last] = [1, 3, 4, 5].slice(-2)
const arr = [''a'', ''b'', ''c'']; // => [ ''a'', ''b'', ''c'' ]
const { [arr.length-1]: last} = arr;
console.log(last); // => ''c''