2009-05-25 14 views
31

È un modo standard per assegnare a più variabili da un array in JavaScript? in Firefox e Opera, si può fare:È possibile assegnare a più variabili da un array?

var [key, value] = "key:value".split(":"); 
alert(key + "=" + value); // will alert "key = value"; 

Ma non funziona in IE8 o Google Chrome.

Qualcuno sa un modo piacevole per farlo in altri browser senza una variabile tmp?

var tmp = "key:value".split(":"); 
var key=tmp[0], value=tmp[1]; 

È questo qualcosa che verrà in una prossima versione di JavaScript, o semplicemente un'implementazione personalizzata in FF e Opera?

+0

sta dividendo sul colon sicuro? Cosa succede se c'è un colon in uno dei valori? – Nosredna

+2

Ciao, non preoccuparti dei due punti. E 'stato un esempio casuale. Mi stavo chiedendo se è possibile assegnare a più variabili da un array. O se potrebbe essere possibile nel prossimo futuro. – gregers

risposta

8

Se volete sapere cosa sta per succedere, leggere la sezione sulla destrutturazione Assignment.

https://developer.mozilla.org/en/New_in_javascript_1.7

Quali caratteristiche lingua che si può utilizzare è sempre dipendente dal proprio ambiente.

Lo sviluppo per Safari Mobile (o uno stack Web per altri browser come Palm Pre, Android, ecc.) O AIR, ad esempio, è più prevedibile rispetto allo sviluppo per il web in generale (dove devi ancora prendere IE6 in considerazione).


Una soluzione cross-browser per il problema a portata di mano potrebbe essere quella di inizializzare un array che aveva un elenco delle variabili da compilare in formato window.variable, poi basta scorrere. Non riesco a immaginare perché lo faresti comunque. Sembra che ci sarebbe sempre una soluzione migliore.

+1

https://developer.mozilla.org/en/New_in_javascript_1.7#Destructuring_assignment era proprio quello che stavo cercando! Ho provato a leggere le specifiche di EcmaScript, ma era un po 'pesante. La documentazione di Mozilla era molto buona! Grazie :) – gregers

0

penso che dovrebbe essere una parte della nuova specifica, poi di nuovo è una lunga lettura ...:. P

key = "key:value".split(":")[0]; 
value = "key:value".split(":")[1]; 

unica alternativa che posso pensare off.

+1

Questa non è un'alternativa, i greger hanno notato che la possibile soluzione nella sua domanda. –

+0

utilizzando la variabile temporanea è un'opzione molto migliore! – nickf

+0

Ha notato, la possibilità di farlo con una variabile temporanea, tuttavia in questo metodo non ce n'è bisogno. –

1

Non penso che sia possibile in un browser crossover. Il meglio che io so che potrebbe aiutare in alcune circostanze è questo:

// we'll pretend you don't need the key. 
var value = "key:value".split(":")[1]; 
0

Io non so come si utilizza questo, ma se ero in grado di determinare il mio proprio formato per la "chiave: il valore" stringa, sarei tentato di utilizzare jSON a poco eval la stringa nell'oggetto necessaria:

var obj = eval("{'key':'key_str', 'value':'val_str'}"); 
alert(obj.key + "=" + ojb.value); //alerts "key_str=value_str 
+2

Mi spiace per la domanda confusa, ma in particolare voglio assegnare a più variabili da un array. La funzione split restituirà un array. Btw eval è il male;) – gregers

+0

Ah, capisco. Lo split() era solo per la domanda, per ottenere un array per il tuo esempio. E perché è eval male? Non è sicuro, ma poi non c'è nulla in javascript. – jrb

3

Ho appena avuto esattamente lo stesso problema, e come un esercizio per me si avvicinò con il seguente:

var key, value; 

(function(arr){ 
    key=arr[0]; 
    value=arr[1]; 
})("key:value".split(":")); 

alert(key + "=" + value); 

sembra brutto a me, io preferisco usare Temp var (tecnicamente, sto usando qui comunque una variabile temporanea).

15

L'incarico di destrutturazione è stato standardizzato in ECMAScript 2015 (a.k. ES6). Ma non tutti i browser hanno già implementato la destrutturazione (a partire da marzo 2016) e anche quando lo faranno ci vorrà un po 'prima che gli utenti si aggiornino a un browser con supporto. Vedi examples nelle specifiche per tutte le fantastiche cose che puoi fare. Ecco alcuni:

// Assign from array elements 
var [key, value] = "key:value".split(":"); 
// key => 'key' 
// value => 'value' 

// Assign from object properties 
var {name: a, age: b} = {name: 'Peter', age: 5}; 
// a => 'Peter' 
// b => 5 

// Swap 
[a, b] = [b, a] 
// a => 5 
// b => 'Peter' 

Poiché questa funzionalità interrompe la compatibilità all'indietro, è necessario transpile il codice per farlo funzionare in tutti i browser.Molti dei transpilers esistenti supportano la destrutturazione. Babel è un transpiler molto popolare. Vedi Kangax´s table of browser and transpiler ES6-support.

Maggiori informazioni:

Compatibility table for ES6 browser support

Exploring ES6 - Destructuring chapter

Problemi correlati