Descompactando array em variáveis ​​separadas em JavaScript

141

Este é um problema simples, e eu já fiz isso antes. Só não consigo lembrar como, ou como exatamente foi chamado.

Em python eu posso fazer isso:

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

como faço isso em JavaScript?

Carson Myers
fonte

Respostas:

173

Atualmente, é a única solução compatível com vários navegadores AFAIK:

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

O ES6 permitirá a atribuição de desestruturação:

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

Ou, para manter o seu exemplo inicial:

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

Você também pode criar um valor padrão:

const [one = 'one', two = 'two', three = 'three'] = [1, 2];
console.log(one); // 1
console.log(two); // 2
console.log(three); // 'three'
Mathias Bynens
fonte
5
A atribuição de destruição da estrutura tem suporte total a partir de hoje kangax.github.io/compat-table/es6/#test-destructuring
grandrew
20

Essa é uma tarefa de desestruturação . Você pode fazer isso em alguns navegadores com a seguinte sintaxe:

[one, two] = arr;

É suportado em alguns dos mais recentes navegadores e transpilers como Babel e Traceur . Esse foi um recurso introduzido no ECMAScript 4, que mais tarde se tornou o ECMAScript Harmony, que acabou se tornando o ES 2015.

Andy E
fonte
Parece que faz parte do ES6 (2015), não do ES4? ecma-international.org/ecma-262/6.0/…
jab
@ jab: obrigado! Às vezes, essas velhas respostas se esquecido e se tornar desatualizado, embora parece que Mathias já adicionou essa informação para a sua resposta :)
Andy E
6

Você pode usar a função aplicar da matriz se desejar que os itens de uma matriz sejam passados ​​como argumentos de função.

grave
fonte
4
Não tenho certeza se um JavaScript Arraytem uma .apply()função. Eu acho que você quis dizer some_function.apply(this, my_array). Veja esta resposta
Kit
5

Implementação da idéia séria.

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

(function(a, b, c, d) {
    console.log(a, b, c, d);   
}.apply(this, ['a', 'b', 'c', 'd']));
Richard Ayotte
fonte
Este fez o meu dia. Descompactar listas via apply, muito bem, senhor!
mike239x
2
var one = arr[0];
var two = arr[1];
Rob Waminal
fonte
1
Você realmente deve usar varpara impedir que as variáveis ​​poluam o escopo global.
Mathias Bynens
Eu só estou assumindo suas variáveis todos declarados :)
Rob waminal
Provavelmente, é uma idéia melhor declarar todos os vars para cada escopo de uma só vez, em vez de ter duas vardeclarações separadas .
Mathias Bynens
2

O CoffeeScript possui: http://jashkenas.github.com/coffee-script/#pattern_matching

E, citado no topo da página:

"O CoffeeScript é uma pequena linguagem que se compila no JavaScript. Pense nele como o irmão mais ostentoso do JavaScript - os mesmos genes, aproximadamente a mesma altura, mas um senso de estilo diferente. Além de um punhado de guloseimas, as declarações no CoffeeScript correspondem a -para um com seu equivalente em JavaScript, é apenas outra maneira de dizê-lo. "

Jakob
fonte
1
Isso não responde à pergunta. Compreendo que o CoffeeScript tenha algumas coisas legais, mas a pergunta é sobre Javascript.
Hovis Biddle
Dead link: ((((
Paul Draper