2009-05-25 11 views
31

¿Es una forma estándar de asignar múltiples variables desde una matriz en JavaScript? En Firefox y Opera, que puede hacer:¿Se puede asignar a múltiples variables de una matriz?

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

Pero no funciona en IE8 o Google Chrome.

¿Alguien sabe una buena manera de hacer esto en otros navegadores sin una variable tmp?

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

¿Esto es algo que vendrá en una próxima versión de JavaScript, o simplemente implementación personalizada en FF y Opera?

+0

se está dividiendo en el colon seguro? ¿Qué pasa si hay dos puntos en uno de los valores? – Nosredna

+2

Hola, no te preocupes por el colon. Fue un ejemplo al azar. Me pregunto si es posible asignar múltiples variables de una matriz. O si es posible en el futuro cercano. – gregers

Respuesta

8

Si usted quiere saber lo que viene, lea la sección sobre la asignación desestructurada.

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

Qué funciones idioma puede utilizar siempre depende de su entorno.

Desarrollar para Mobile Safari (o una pila web para otros navegadores como Palm Pre, Android, etc.) o AIR, por ejemplo, es más predecible que desarrollar para la web en general (donde todavía tiene que tomar incluso IE6 en cuenta).


Una solución multi-navegador para el problema en cuestión sería para inicializar una matriz que tenía una lista de las variables que desea llenar en formato window.variable, a continuación, sólo a través del bucle. No puedo imaginar por qué lo harías sin embargo. Parece que siempre habrá una mejor solución.

+1

https://developer.mozilla.org/en/New_in_javascript_1.7#Destructuring_assignment era justo lo que estaba buscando. Intenté leer las especificaciones de EcmaScript, pero eso fue un poco pesado. ¡La documentación de mozilla fue muy buena! Gracias :) – gregers

0

creo que debe ser una parte de la nueva especificación, a continuación, de nuevo, es una lectura larga ...:. P

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

única alternativa que se me ocurre fuera.

+1

Eso no es una alternativa, Gregers notó esa posible solución en su pregunta. –

+0

usando la variable temporal es una opción mucho mejor! – nickf

+0

Señaló, la posibilidad de hacerlo con una variable temporal, sin embargo, en este método no hay necesidad de uno. –

1

No creo que esto sea posible de forma cruzada. Lo mejor que sé lo que podría ayudar en algunas circunstancias es la siguiente:

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

No sé cómo está utilizando esto, pero si yo era capaz de determinar mi propio formato para la "clave: valor" cadena, me gustaría tener la tentación de utilizar JSON simplemente eval la cadena en un objeto necesario:

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

Perdón por la pregunta confusa, pero específicamente quiero asignar a múltiples variables de una matriz. La función de división devolverá una matriz. Btw eval es malo;) – gregers

+0

Ah, ya veo. La división() fue solo para la pregunta, para obtener una matriz para su ejemplo. ¿Y por qué eval eval es malo? No es seguro, pero tampoco hay nada en javascript. – jrb

3

que acaba de tener exactamente la misma pregunta, y como un ejercicio para mí mismo ocurrió la siguiente:

var key, value; 

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

alert(key + "=" + value); 

ve feo a mí, yo prefiero usar var temp (técnicamente, estoy usando aquí una variable de temperatura de todos modos).

15

La asignación de desestructuración se estandarizó en ECMAScript 2015 (a.k.a ES6). Pero no todos los navegadores han implementado la desestructuración aún (desde marzo de 2016), e incluso cuando lo hacen, les tomará un tiempo antes de que los usuarios actualicen a un navegador con soporte. Consulte examples en la especificación de todas las cosas increíbles que puede hacer. He aquí algunas:

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

Debido a esta característica rompe la compatibilidad hacia atrás, tendrá que transpile el código para que funcione en todos los navegadores.Muchos de los transpilers existentes soportan la desestructuración. Babel es un transpiler muy popular. Ver Kangax´s table of browser and transpiler ES6-support.

Más información:

Compatibility table for ES6 browser support

Exploring ES6 - Destructuring chapter

Cuestiones relacionadas