Pregunta Javascript: divide la cadena en 2d array


Tengo una cadena de meses y años:

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 la 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 esto actualmente 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 tenga que usar el monthArray var?


5
2017-12-21 17:49


origen


Respuestas:


Puedes usar replace para obtener un 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 mapa si su navegador de destino lo admite:

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

9
2017-12-21 17:59



Si está condensado es lo que está buscando:

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

4
2017-12-21 18:00



JavaScript es otro lenguaje dinámico y su tipo de variable te permite guardar cualquier cosa donde quieras. Hiciste la división correcta, ahora solo divide esa cuerda con _ Y lo puso de nuevo allí.

Mira 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é quieres decir con no usar monthArray. ¡El código de arriba es lo menos que puedes hacer, probablemente!


3
2017-12-21 17:52



Dividir cada división es una cosa sensata de hacer puede usar una expresión regular para unir los números separados del subrayado, e inserte cada par en su propia matriz empujada a la matriz del mes-

pero no veo una mejora sobre 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]]
*/

1
2017-12-21 18:21