2009-05-25 13 views
31

Ist es eine Standardmethode, um mehrere Variablen aus einem Array in JavaScript zuzuweisen? In Firefox und Opera können Sie tun:Kann man mehrere Variablen aus einem Array zuweisen?

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

Aber es funktioniert nicht in IE8 oder Google Chrome.

Kennt jemand eine nette Möglichkeit, dies in anderen Browsern ohne eine tmp-Variable zu tun?

Ist das etwas, das in einer kommenden JavaScript-Version oder nur benutzerdefinierte Implementierung in FF und Opera kommen wird?

+0

Ist Spaltung auf dem Doppelpunkt sicher? Was ist, wenn in einem der Werte ein Doppelpunkt steht? – Nosredna

+2

Hallo, mach dir keine Sorgen um den Doppelpunkt. Es war ein zufälliges Beispiel. Ich frage mich nur, ob es möglich ist, mehrere Variablen aus einem Array zuzuweisen. Oder wenn es in naher Zukunft möglich sein könnte. – gregers

Antwort

8

Wenn Sie wissen wollen, was kommt, lesen Sie den Abschnitt über die Destrukturierung Zuordnung.

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

Welche Sprache Funktionen, die Sie ist immer abhängig von Ihrer Umgebung nutzen können.

Entwickeln für Mobile Safari (oder einen Web-Stack für andere Browser wie Palm Pre, Android, etc.) oder AIR, zum Beispiel, ist vorhersehbarer als für das Web im Allgemeinen zu entwickeln (wo Sie immer noch nehmen müssen IE6 berücksichtigt).


Eine Cross-Browser-Lösung für das Problem bei der Hand wäre ein Array zu initialisieren, die eine Liste der Variablen, die Sie in window.variable Format füllen wollen hatte, dann durch nur Schleife. Ich kann mir nicht vorstellen, warum du es tun würdest. Scheint so, als gäbe es immer eine bessere Lösung.

+1

https://developer.mozilla.org/de/New_in_javascript_1.7#Destructuring_assignment war genau das, was ich gesucht habe! Ich habe versucht, die EcmaScript-Spezifikation zu lesen, aber das war ein bisschen schwer. Die Mozilla Dokumentation war sehr gut! Vielen Dank :) – gregers

0

ich denke, es sollte ein Teil der neuen Spezifikation sein, dann wieder ist es eine lange lesen ...: s.

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

Nur Alternative, die ich weg denken.

+1

Das ist keine Alternative, bemerkte Gregers mögliche Lösung in seiner Frage. –

+0

mit der temporären Variable ist eine viel bessere Option! – nickf

+0

Er bemerkte, die Möglichkeit, dies mit einer temporären Variable zu tun, aber in dieser Methode gibt es keine Notwendigkeit. –

1

Ich glaube nicht, dass dies in einem Cross-Browser-Möglichkeit möglich ist. Das Beste, was ich weiß, was in einigen Fällen helfen könnte, ist dies:

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

Ich weiß nicht, wie Sie diese verwenden, aber wenn ich konnte mein eigenes Format für die Bestimmung „Schlüssel: Wert“ String, würde ich json zu verwenden versucht sein, zu eval nur die Zeichenfolge in das gewünschte Objekt:

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

Sorry über die verwirrende Frage, aber ich möchte vor allem mehrere Variablen aus einem Array zuweisen. Die Split-Funktion gibt ein Array zurück. Btw Eval ist böse;) – gregers

+0

Ah, ich verstehe. Die split() war nur für die Frage, um ein Array für dein Beispiel zu bekommen. Und warum ist Eval böse? Es ist nicht sicher, aber auch nichts in Javascript. – jrb

3

Ich hatte gerade genau die gleiche Frage, und als eine Übung für mich kam mit dem Follow-up:

var key, value; 

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

alert(key + "=" + value); 

Sieht hässlich zu mir, ich eher temporären var (technisch verwenden würde, ich bin hier mit eine Temperaturvariable sowieso).

15

Die Strukturierungszuordnung wurde in ECMAScript 2015 (a.k.a. ES6) standardisiert. Aber nicht alle Browser haben bereits eine Destrukturierung implementiert (Stand März 2016), und selbst wenn dies der Fall ist, wird es eine Weile dauern, bis Benutzer mit Unterstützung auf einen Browser aktualisieren. Sehen Sie examples in der Spezifikation für all die tollen Dinge, die Sie tun können. Hier sind einige:

// 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' 

Da diese Funktion Rückwärtskompatibilität bricht, müssen Sie transpile der Code, um es in allen Browsern funktioniert.Viele der vorhandenen transpilers unterstützen Destrukturierung. Babel ist ein sehr beliebter Transpiler. Siehe Kangax´s table of browser and transpiler ES6-support.

Weitere Informationen:

Compatibility table for ES6 browser support

Exploring ES6 - Destructuring chapter

Verwandte Themen