No coffeescript, isso é direto:
coffee> a = ['a', 'b', 'program']
[ 'a', 'b', 'program' ]
coffee> [_..., b] = a
[ 'a', 'b', 'program' ]
coffee> b
'program'
O es6 permite algo semelhante?
> 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)
Claro que posso fazer isso da maneira es5 -
const a = b[b.length - 1]
Mas talvez isso seja um pouco sujeito a erros. O splat pode ser apenas a última coisa na desestruturação?
ecmascript-6
destructuring
George Simms
fonte
fonte
...
em es6, particularmente que ele só pode ser usado como a última coisa durante a desestruturação ou em uma lista de parâmetros. Isso é potencialmente contra-intuitivo para alguém que entra no es6 do coffeescript e, portanto, essa pergunta é potencialmente útil.[1,2,3].slice(-1)
você não pode nem mesmo ter uma estrutura equivalente a[1,2,3].slice(0, -1)
. Essas são operações comuns. A desestruturação do ES6 é de alguma forma uma piada!Respostas:
Não é possível no ES6 / 2015. O padrão simplesmente não prevê isso.
Como você pode ver nas especificações , o
FormalParameterList
pode ser:FunctionRestParameter
FormalsList
(uma lista de parâmetros)FormalsList
, seguido por umFunctionRestParameter
Tendo
FunctionRestParameter
seguido os parâmetros não é fornecido.fonte
fonte
pop
versão mais rápida (OS X, Chrome 68).Acredito que ES6 poderia pelo menos ajudar com isso:
Dado que seu array (arr) não é indefinido e é um elemento iterável (sim, até mesmo strings funcionam !!), ele deve retornar o último elemento ... mesmo para o array vazio e também não o altera. Ele cria uma matriz intermediária ... mas não deve custar muito.
Seu exemplo ficaria assim:
fonte
.slice(-1)[0]
é um pouco menos ruim, ouvar [last]=arr.slice().reverse()
é outro feio se você precisarvar [last] = arr.slice(-1)
Object.defineProperty(Array.prototype, -1, { get() {return this[this.length - 1] } }); [1,2,3][-1]
[].concat(arr).pop();
que não sofre mutaçãoarr
.Você pode desestruturar o array invertido para chegar perto do que deseja.
fonte
const last = ['bbb', 'uuu', 'iii'].slice(-1);
? Em termos de desempenho?.slice(-1)
é tecnicamente mais rápido, mas não lhe dá tanto o último item eo subarray em uma chamada, que é um benefício do...
splat quando desestruturação. O acerto de desempenho de reverter duas vezes deve ser considerado quando usado em arrays mais longos, mas para um pequeno script provavelmente vale a pena a conveniência? Mas você poderia facilmentelet a = array.slice(-1), rest = array.slice(0,array.length-2)
se ainda quisesse o oneliner no ES5, que é ~ 4% mais rápido. jsperf.com/last-array-splatoutra abordagem é:
fonte
Não necessariamente a maneira mais eficaz de fazer. Mas dependendo do contexto, uma maneira bastante elegante seria:
fonte
fonte
Isso deve funcionar:
fonte
Você pode tentar este hack:
fonte
Definitivamente, a questão é sobre Destructuring for JavaScript Arrays, e sabemos que não é possível ter o último item de um Array usando a atribuição de desestruturação, há uma maneira de fazer isso imutável , veja o seguinte:
Não alteramos a
arr
variável, mas ainda temos todos os membros da matriz, exceto o último item como uma matriz e temos o último item separadamente.fonte
fonte
Não destruindo caminho, mas poderia ajudar. De acordo com a documentação do javascript e o método reverso, pode tentar o seguinte:
fonte