2011-12-21 5 views
5

J'ai une chaîne de mois et années:Javascript: Éclate une chaîne dans un tableau 2d

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

Je veux que ce soit dans un tableau 2D à l'année dans la première position de chaque tableau et le mois dans le deuxième position. En d'autres termes, je veux mettre fin à ceci:

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

La façon dont je le fais est actuellement:

//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("_"); 

est-il un moyen de condenser ce code pour que je jamais besoin d'utiliser la monthArray var?

Répondre

9

Vous pouvez utiliser replace pour obtenir le code plus compact:

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)]); 
}) 

ou map si votre navigateur cible supporte:

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

JavaScript est une autre langue dynamique et son type variable vous permet de conserver n'importe quoi où vous voulez. Vous avez fait la séparation droite, maintenant juste divisé cette chaîne avec _ et le remettre là.

Voir cet exemple:

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); 

Je ne sais pas ce que vous entendez par ne pas utiliser monthArray. Le code ci-dessus est le moins que vous puissiez faire, probablement!

4

Si condensé est ce que vous êtes après:

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

Diviser chaque division est une bonne chose à faire - vous pouvez utiliser une expression régulière pour correspondre le trait de soulignement nombres séparés, et insérez chaque paire dans son propre tableau poussé au mois array-

mais je ne vois pas une amélioration par rapport à votre code:

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]] 
*/