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
?
4 réponses
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)]);
})
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!
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]]
*/
Si vous êtes condensé, c'est ce que vous recherchez:
var month_array = months.split(",").map(function(x){return x.split("_")});
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.