web-dev-qa-db-fra.com

Destructuration pour obtenir le dernier élément d'un tableau dans es6

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?

86
George Simms

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));
183
Ryan Huang

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() );
31
shoesel

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>";
28
KamiOfTea

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
5
theTaoOfJS
const arr = ['a', 'b', 'c']; // => [ 'a', 'b', 'c' ]

const {
  [arr.length - 1]: last
} = arr;

console.log(last); // => 'c'
2
andrhamm

Cela devrait fonctionner:

const [lastone] = myArray.slice(-1);
1
OPulido