Décompresser le tableau en variables séparées en JavaScript

141

C'est un problème simple, et je l'ai déjà fait. Je ne me souviens tout simplement pas comment ou comment cela s'appelait exactement.

En python, je peux faire ceci:

arr = ['one', 'two']
one, two = arr

comment faire cela en JavaScript?

Carson Myers
la source

Réponses:

173

C'est actuellement la seule solution AFAIK compatible cross-browser:

var one = arr[0],
    two = arr[1];

ES6 permettra l'affectation de déstructuration:

let [x, y] = ['foo', 'bar'];
console.log(x); // 'foo'
console.log(y); // 'bar'

Ou, pour vous en tenir à votre exemple initial:

var arr = ['one', 'two'];
var [one, two] = arr;

Vous pouvez également créer une valeur par défaut:

const [one = 'one', two = 'two', three = 'three'] = [1, 2];
console.log(one); // 1
console.log(two); // 2
console.log(three); // 'three'
Mathias Bynens
la source
5
l'affectation de déstructuration a un support complet à partir d'aujourd'hui kangax.github.io/compat-table/es6/#test-destructuring
grandrew
20

C'est une mission destructrice . Vous pouvez le faire dans certains navigateurs avec la syntaxe suivante:

[one, two] = arr;

Il est pris en charge dans certains des derniers navigateurs et transpileurs tels que Babel et Traceur . Il s'agissait d'une fonctionnalité introduite avec ECMAScript 4 qui est devenu plus tard ECMAScript Harmony, qui est finalement devenu ES 2015.

Andy E
la source
On dirait que cela fait partie d'ES6 (2015), pas d'ES4? ecma-international.org/ecma-262/6.0/…
jab
@jab: merci! Parfois, ces anciennes réponses sont oubliées et deviennent obsolètes, bien qu'il semble que Mathias ait déjà ajouté cette information à sa réponse :)
Andy E
6

Vous pouvez utiliser la fonction apply du tableau si vous souhaitez qu'un élément du tableau soit passé en tant qu'arguments de fonction.

sérieux
la source
4
Je ne suis pas sûr qu'un JavaScript Arrayait une .apply()fonction. Je pense que tu voulais dire some_function.apply(this, my_array). Voir cette réponse
Kit
5

Mise en œuvre de l'idée sérieuse.

http://jsfiddle.net/RichAyotte/6D2wP/

(function(a, b, c, d) {
    console.log(a, b, c, d);   
}.apply(this, ['a', 'b', 'c', 'd']));
Richard Ayotte
la source
Celui-ci a fait ma journée. Déballage des listes via Apply, bravo monsieur!
mike239x
2
var one = arr[0];
var two = arr[1];
voler waminal
la source
1
Vous devriez vraiment utiliser varpour empêcher les variables de polluer la portée globale.
Mathias Bynens
Je suppose juste que toutes ses variables déclarées :)
rob waminal
C'est probablement une meilleure idée de déclarer tous les vars pour chaque portée en une seule fois plutôt que d'avoir deux vardéclarations distinctes .
Mathias Bynens
2

CoffeeScript l'a: http://jashkenas.github.com/coffee-script/#pattern_matching

Et, cité en haut de la page:

"CoffeeScript est un petit langage qui se compile en JavaScript. Considérez-le comme le petit frère de JavaScript le moins ostentatoire - les mêmes gènes, à peu près la même hauteur, mais un sens du style différent. Mis à part une poignée de bonus bonus, les déclarations de CoffeeScript correspondent à une -to-one avec leur équivalent en JavaScript, c'est juste une autre façon de le dire. "

Jakob
la source
1
Cela ne répond pas à la question. J'apprécie que CoffeeScript ait des choses intéressantes, mais la question concerne Javascript.
Hovis Biddle
Lien mort: (((
Paul Draper