2011-12-21 17 views
5

que tiene una cadena de mes y año:Javascript: Separar una cadena en una matriz 2D

var months= "2010_1,2010_3,2011_4,2011_7"; 

Quiero hacer esto en una matriz 2D con el año en la primera posición de cada matriz y el mes en el segunda posición. En otras palabras, quiero terminar con esto:

var monthArray2d = [[2010,1],[2010,3][2011,4],[2011,7]]; 

La forma en que hago este momento es:

//array of selected months 
var monthArray = months.split(","); 

//split each selected month into [year, month] array 
var monthArray2d = new Array(); 
for (var i = 0; i < monthArray.length; i++) { 
    monthArray2d[i] = monthArray[i].split("_"); 

¿Hay una manera de condensar ese código para que nunca necesito usar el monthArray var?

Respuesta

9

Puede utilizar replace para obtener el código más compacto:

var months= "2010_1,2010_3,2011_4,2011_7"; 
var monthArray2d = [] 

months.replace(/(\d+)_(\d+)/g, function($0, $1, $2) { 
    monthArray2d.push([parseInt($1), parseInt($2)]); 
}) 

o map si su navegador de destino admite que:

monthArray2d = months.split(",").map(function(e) { 
    return e.split("_").map(Number); 
}) 
3

JavaScript es otro lenguaje dinámico y su tipo de variable le permite guardar todo lo que desee. Hiciste la división correcta, ahora solo divide esa cadena con _ y vuelve a colocarla allí.

ver este ejemplo:

var months= "2010_1,2010_3,2011_4,2011_7"; 

var monthArray = months.split(","); 

for (var i = 0; i < monthArray.length; i++) { 
    monthArray[i] = monthArray[i].split("_"); 
} 

console.log(monthArray); 

No sé qué quiere decir con no usar monthArray. ¡El código anterior es lo mínimo que puedes hacer, probablemente!

4

Si condensado es lo que está buscando:

var month_array = months.split(",").map(function(x){return x.split("_")}); 
1

Dividir cada división es una opción sensata: puede utilizar una expresión regular para coincidir con los números de subrayado separado, e insertar cada par en su propia matriz empujado con el mes Expandido

pero no ve una mejora con respecto a su código:

var s= "2010_1,2010_3,2011_4,2011_7", 

A= [], rx=/(\d+)_(\d+)/g; 

while((M= rx.exec(s))!= null){ 
    A.push([M[1], M[2]]); 
} 


/* returned value: (Array) 
[[2010,1],[2010,3],[2011,4],[2011,7]] 
*/