Dans coffeescript, cela est simple:
coffee> a = ['a', 'b', 'program']
[ 'a', 'b', 'program' ]
coffee> [_..., b] = a
[ 'a', 'b', 'program' ]
coffee> b
'program'
Est-ce que es6 permet 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 est-ce un peu sujet à des erreurs. Le splat peut-il être seulement la dernière chose dans la déstructuration?
Ce n'est pas possible dans ES6/2015. La norme ne le prévoit tout simplement pas.
Comme vous pouvez le voir dans la spécification , le FormalParameterList
peut être soit:
FunctionRestParameter
FormalsList
(une liste de paramètres)FormalsList
, suivi de FunctionRestParameter
Il n'est pas fourni d'avoir FunctionRestParameter
suivi de paramètres.
console.log('last', [1, 3, 4, 5].slice(-1));
console.log('second_to_last', [1, 3, 4, 5].slice(-2));
Je crois que ES6 pourrait au moins aider avec ça:
[...arr].pop()
Etant donné que votre tableau (arr) n’est pas indéfini et qu’il s’agit d’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 ne le modifie pas non plus. Cela crée un tableau intermédiaire, mais cela ne devrait pas coûter cher.
Votre exemple ressemblerait alors à ceci:
console.log( [...['a', 'b', 'program']].pop() );
Vous pouvez déstructurer le tableau inversé pour vous rapprocher de ce que vous voulez.
const [a, ...rest] = ['a', 'b', 'program'].reverse();
document.body.innerHTML =
"<pre>"
+ "a: " + JSON.stringify(a) + "\n\n"
+ "rest: " + JSON.stringify(rest.reverse())
+ "</pre>";
Pas nécessairement la manière la plus performante de faire. Mais selon le contexte, une manière assez élégante serait:
const myArray = ['one', 'two', 'three'];
const theOneIWant = [...myArray].pop();
console.log(theOneIWant); // 'three'
console.log(myArray.length); //3
const arr = ['a', 'b', 'c']; // => [ 'a', 'b', 'c' ]
const {
[arr.length - 1]: last
} = arr;
console.log(last); // => 'c'
Cela devrait fonctionner:
const [lastone] = myArray.slice(-1);