Decomprimere l'array in variabili separate in JavaScript


141

Questo è un problema semplice, e l'ho già fatto prima. Non riesco proprio a ricordare come, o esattamente come si chiamava.

In Python posso fare questo:

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

come posso farlo in JavaScript?

Risposte:


173

Questa è attualmente l'unica soluzione compatibile con più browser AFAIK:

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

ES6 consentirà l'incarico di destrutturazione:

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

Oppure, per attenersi al tuo esempio iniziale:

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

È inoltre possibile creare un valore predefinito:

const [one = 'one', two = 'two', three = 'three'] = [1, 2];
console.log(one); // 1
console.log(two); // 2
console.log(three); // 'three'

5
l'incarico di destrutturazione ha pieno supporto a partire da oggi kangax.github.io/compat-table/es6/#test-destructuring
grandrew

20

È un compito distruttivo . Puoi farlo in alcuni browser con la seguente sintassi:

[one, two] = arr;

È supportato in alcuni dei browser e transpiler più recenti come Babel e Traceur . Questa era una funzionalità introdotta con ECMAScript 4 che in seguito divenne ECMAScript Harmony, che alla fine divenne ES 2015.


Sembra che faccia parte di ES6 (2015), non ES4? ecma-international.org/ecma-262/6.0/…
jab

@jab: grazie! a volte queste vecchie risposte vengono dimenticate e diventano obsolete, anche se sembra che Mathias abbia già aggiunto queste informazioni alla sua risposta :)
Andy E


6

È possibile utilizzare la funzione di applicazione dell'array se si desidera passare elementi di un array come argomenti di funzione.


4
Non sono sicuro che JavaScript Arrayabbia una .apply()funzione. Penso che volevi dire some_function.apply(this, my_array). Vedi questa risposta
Kit


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

1
Dovresti davvero usare varper impedire alle variabili di inquinare l'ambito globale.
Mathias Bynens,

Sto solo assumendo che siano tutte le variabili dichiarate :)
rob waminal,

Probabilmente è un'idea migliore dichiarare tutti vari messaggi per ogni ambito in una volta piuttosto che avere due vardichiarazioni separate .
Mathias Bynens,

2

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

E, citato dalla parte superiore della pagina:

"CoffeeScript è un piccolo linguaggio che viene compilato in JavaScript. Pensalo come il fratello minore meno appariscente di JavaScript: gli stessi geni, all'incirca la stessa altezza, ma un diverso senso dello stile. A parte una manciata di bonus bonus, le dichiarazioni in CoffeeScript corrispondono a -to-one con il loro equivalente in JavaScript, è solo un altro modo di dirlo. "


1
Questo non risponde alla domanda. Apprezzo il fatto che CoffeeScript abbia alcune cose in ordine, ma la domanda riguarda Javascript.
Hovis Biddle,

Dead link: ((((
Paul Draper
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.