Dans coffeescript, c'est simple:
coffee> a = ['a', 'b', 'program']
[ 'a', 'b', 'program' ]
coffee> [_..., b] = a
[ 'a', 'b', 'program' ]
coffee> b
'program'
ES6 permet-il quelque chose de similaire?
> 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)
Bien sûr, je peux le faire de la manière es5 -
const a = b[b.length - 1]
Mais peut-être que c'est un peu sujet à une erreur. Le splat ne peut-il être que la dernière chose dans la déstructuration?
ecmascript-6
destructuring
George Simms
la source
la source
...
dans es6, en particulier qu'il ne peut être utilisé que comme dernière chose lors de la déstructuration ou dans une liste de paramètres. Ceci est potentiellement contre-intuitif pour quelqu'un qui entre dans es6 à partir de coffeescript et cette question est donc potentiellement utile.[1,2,3].slice(-1)
vous ne pouvez même pas déstructurer l'équivalent[1,2,3].slice(0, -1)
. Ce sont des opérations courantes. La déstructuration ES6 est en quelque sorte une blague!Réponses:
Ce n'est pas possible dans ES6 / 2015. La norme ne le prévoit tout simplement pas.
Comme vous pouvez le voir dans les spécifications , le
FormalParameterList
peut être:FunctionRestParameter
FormalsList
(une liste de paramètres)FormalsList
, suivi d'unFunctionRestParameter
Avoir
FunctionRestParameter
suivi des paramètres n'est pas fourni.la source
la source
pop
version la plus rapide (OS X, Chrome 68).Je pense que ES6 pourrait au moins vous aider:
Étant donné que votre tableau (arr) n'est pas indéfini et est un élément itérable (oui, même les chaînes fonctionnent !!), il devrait renvoyer le dernier élément .. même pour le tableau vide et il ne le modifie pas non plus. Cela crée cependant un tableau intermédiaire ... mais cela ne devrait pas coûter cher.
Votre exemple ressemblerait alors à ceci:
la source
.slice(-1)[0]
peu moins mauvais, ouvar [last]=arr.slice().reverse()
c'est un autre moche si vous en avez besoinvar [last] = arr.slice(-1)
Object.defineProperty(Array.prototype, -1, { get() {return this[this.length - 1] } }); [1,2,3][-1]
[].concat(arr).pop();
qui ne mute pasarr
.Vous pouvez déstructurer le tableau inversé pour vous rapprocher de ce que vous voulez.
la source
const last = ['bbb', 'uuu', 'iii'].slice(-1);
? En termes de performances?.slice(-1)
est techniquement plus rapide, mais il ne vous donne pas à la fois le dernier élément ET le sous-tableau en un seul appel, ce qui est un avantage du...
splat lors de la déstructuration. L'inversion des performances à deux reprises doit être prise en compte lorsqu'elle est utilisée sur des tableaux plus longs, mais pour un petit script, cela en vaut-il probablement la peine? Mais vous pourriez tout aussi facilementlet a = array.slice(-1), rest = array.slice(0,array.length-2)
si vous vouliez toujours le oneliner dans ES5, c'est ~ 4% plus rapide. jsperf.com/last-array-splatune autre approche est:
la source
Pas nécessairement la manière la plus performante de faire. Mais selon le contexte, une manière assez élégante serait:
la source
la source
Cela devrait fonctionner:
la source
Vous pouvez essayer ce hack:
la source
Décidément, la question concerne la destruction des tableaux JavaScript, et nous savons qu'il n'est pas possible d'avoir le dernier élément d'un tableau en utilisant l'affectation de déstructuration, il existe un moyen de le faire immuable , voir ce qui suit:
Nous ne modifions pas la
arr
variable mais avons toujours tous les membres du tableau sauf le dernier élément en tant que tableau et avons le dernier élément séparément.la source
la source
Pas de manière destructrice mais pourrait aider. Selon la documentation javascript et la méthode inverse, essayez ceci:
la source