J'ai une chaîne de mois et d'années:

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

Je veux en faire un tableau 2d avec l'année en première position de chaque tableau et le mois en deuxième position. En d'autres termes, je veux finir avec ceci:

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

La façon dont je le fais actuellement est la suivante:

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

Existe-t-il un moyen de condenser ce code afin que je n'ai jamais besoin d'utiliser la var monthArray?

8
dmr 21 déc. 2011 à 21:49

4 réponses

Meilleure réponse

Vous pouvez utiliser replace pour obtenir un 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 le prend en charge:

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

Fondamentalement, la première fonction recherche les modèles d'année / mois "les chiffres soulignent les chiffres" et stocke chaque sous-chaîne trouvée dans un tableau. Bien sûr, vous pouvez utiliser d'autres délimiteurs au lieu du trait de soulignement. La fonction ne se soucie pas du délimiteur des valeurs (virgule), de sorte qu'il peut être n'importe quoi. Exemple:

var months= "2010/1 ... 2010/3 ... 2011/4";
months.replace(/(\d+)\/(\d+)/g, function($0, $1, $2) {
    monthArray2d.push([parseInt($1), parseInt($2)]);
})
11
georg 23 janv. 2019 à 01:08

JavaScript est un autre langage dynamique et son type de variable vous permet de garder tout ce que vous voulez. Vous avez bien fait le fractionnement, il vous suffit maintenant de fractionner cette chaîne avec _ et de la remettre dedans.

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
John Topley 18 janv. 2012 à 13:16

Fractionner chaque fractionnement est une chose sensée à faire - vous pouvez utiliser une expression régulière pour faire correspondre les nombres séparés par des traits de soulignement, et insérer chaque paire dans son propre tableau poussé dans le tableau des mois -

Mais je ne vois aucune 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]]
*/
1
kennebec 21 déc. 2011 à 18:21

Si vous êtes condensé, c'est ce que vous recherchez:

var month_array = months.split(",").map(function(x){return x.split("_")});
7
Shawn Chin 22 déc. 2011 à 10:19