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 forma 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?
ecmascript-6
destructuring
George Simms
fuente
fuente
...
en es6, particularmente que solo se puede usar como lo último cuando se desestructura o en una lista de parámetros. Esto es potencialmente contrario a la intuición para alguien que ingresa a es6 desde coffeescript y, por lo tanto, esta pregunta es potencialmente útil.[1,2,3].slice(-1)
no se puede desestructurar equivalente a[1,2,3].slice(0, -1)
. Estas son operaciones comunes. ¡La desestructuración de ES6 es de alguna manera una broma!Respuestas:
No es posible en ES6 / 2015. El estándar simplemente no lo prevé.
Como puede ver en la especificación ,
FormalParameterList
puede ser:FunctionRestParameter
FormalsList
(una lista de parámetros)FormalsList
, seguida de unaFunctionRestParameter
FunctionRestParameter
No se proporciona haber seguido los parámetros.fuente
fuente
pop
versión más rápida (OS X, Chrome 68).Creo que ES6 podría al menos ayudar con eso:
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 lo altera. Sin embargo, crea una matriz intermedia ... pero eso no debería costar mucho.
Su ejemplo se vería así:
fuente
.slice(-1)[0]
es un poco menos malo, ovar [last]=arr.slice().reverse()
es otro feo si lo necesitavar [last] = arr.slice(-1)
Object.defineProperty(Array.prototype, -1, { get() {return this[this.length - 1] } }); [1,2,3][-1]
[].concat(arr).pop();
que no cambiaarr
.Puede desestructurar la matriz invertida para acercarse a lo que desea.
fuente
const last = ['bbb', 'uuu', 'iii'].slice(-1);
? ¿En términos de actuaciones?.slice(-1)
es técnicamente más rápido, pero no le brinda tanto el último elemento como el subarreglo en una llamada, lo cual es un beneficio del...
splat al desestructurar. El impacto de rendimiento de invertir dos veces se debe considerar cuando se usa en matrices más largas, pero para un script pequeño, probablemente valga la pena la conveniencia. Pero podría hacerlo con la misma facilidadlet a = array.slice(-1), rest = array.slice(0,array.length-2)
si aún quisiera el delineador en ES5, eso es ~ 4% más rápido. jsperf.com/last-array-splatotro enfoque es:
fuente
No es necesariamente la forma más eficaz de hacerlo. Pero dependiendo del contexto una forma bastante elegante sería:
fuente
fuente
Esto debería funcionar:
fuente
Puedes probar este truco:
fuente
Definitivamente, la pregunta es sobre Desestructuración para matrices de JavaScript, y sabemos que no es posible tener el último elemento de una matriz usando la asignación de desestructuración, hay una forma de hacerlo inmutable , vea lo siguiente:
No mutamos la
arr
variable, pero todavía tenemos todos los miembros de la matriz excepto el último elemento como una matriz y tenemos el último elemento por separado.fuente
fuente
No es destructivo pero podría ayudar. De acuerdo con la documentación de javascript y el método inverso, podría probar esto:
fuente