2010-08-19 20 views
18

Me gustaría saber si el JS estándar proporciona una forma de dividir una cadena directamente en un conjunto de variables durante su declaración inicial. Por ejemplo en Perl yo usaría:javascript: split string directamente a variables

my ($a, $b, $c) = split '-', $str; 

En Firefox que puede escribir

var [a, b, c] = str.split('-'); 

Sin embargo, esta sintaxis no es parte del estándar ECMA y como tal se rompe en todos los demás navegadores. Lo que estoy tratando de hacer es evitar tener que escribir:

var array = str.split('-'); 
var a = array[0]; 
var b = array[1]; 
var c = array[2]; 

Debido a que el código que estoy escribiendo en el momento en que un procedimiento de este tipo sería un verdadero dolor de cabeza, estoy creando 20 variables de 7 diferentes se divide y no quiere tener que usar un método tan detallado.

¿Alguien sabe de una manera elegante de hacer esto?

+2

¿por qué necesita volcar estos objetos en 'var'? ¿Cuál es el final del juego aquí? – hunter

+0

Es parte de un formulario web utilizado para administrar una pequeña base de datos de eventos en el sitio en nuestro campus. Para mostrar a los usuarios cómo se verán sus datos una vez formateados, tomamos la información directamente de los campos del formulario (usando jquery) y producimos un poco de HTML. Para formatear correctamente los intervalos de fechas y algunos otros bits de información, es mucho más conveniente tenerlos almacenados en variables con nombre en lugar de tratar de extraer los valores correctos usando algo como $ ('input [name = start_date]'). val(). split (''). Vea http://pastie.org/1102123 – nb5

+0

posible duplicado de [Desempaquetado de matriz en variables separadas en JavaScript] (http://stackoverflow.com/questions/3422458/unpacking-array-into-separate-variables-in- javascript) –

Respuesta

29

Sólo puede hacerlo ligeramente más elegante omitiendo la var palabra clave para cada variable y la separación de las expresiones por comas:

var array = str.split('-'), 
    a = array[0], b = array[1], c = array[2]; 

ES6 estandariza asignación desestructurada, lo que le permite hacer lo que Firefox ha apoyado durante bastante tiempo ahora:

var [a, b, c] = str.split('-'); 

puede comprobar el apoyo del navegador utilizando Kangax de compatibility table.

+1

Lo sospechaba mucho. Parece una maldita vergüenza tener que ser tan prolijo al respecto. Ah, bueno, gracias por tu ayuda :) – nb5

+0

También puedes eliminar la "var" del código de golf: [a, b, c] = str.split ('-'); – Elo

6
var str = '123', 
    array = str.split(''); 

(function(a, b, c) { 
    a; // 1 
    b; // 2 
    c; // 3 
}).apply(null, array) 
+0

aplicar es un método genial, pero estoy buscando usar menos código en lugar de más;) – nb5

+0

@ nb5: no creo que sea * ese * código mucho más que 'var a = array [0], b = array [ 1], c = array [2]; '. –

+0

¿Pero funciona? No veo que funcione tampoco :( – mplungjan

0

Se puede crear una función que va a recorrer la matriz que se crea por el método str.split y concesionarios generar variables de este modo:

function autoGenerateVarFromArray(srcArray, varNamePrefix) 
{ 
    var i = 0 
    while(i < srcArray.length) 
    { 
    this[varNamePrefix +'_' + i] = srcArray[i]; 
    i++; 
    } 
} 

Aquí hay un ejemplo de cómo utilizar este:

var someString = "Mary had a little Lamb"; 
autoGenerateVarFromArray(someString.split(' '), 'temp'); 

alert(this.temp_3); // little 
+0

Esto es genial, pero en la medida en que puedo ver las variables autogeneradas usando un solo prefijo de nombre seguido de un número sería un poco diferente de simplemente hacer referencia directa al elemento de la matriz por índice. – nb5

+0

Este método evita la minificación de código. –

+0

@ nb5: Eso es cierto. Esta solución puede ser más escalable si tiene una matriz enorme y muchas variables para inicializar. Si solo tiene un tamaño de matriz pequeño, las otras soluciones publicadas no son tan malas (var apple = a [1], banana = a [2], etc.) – Gary