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?

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'

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.


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.


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


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

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. "


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.