我有一个月和年的字符串:
var months= "2010_1,2010_3,2011_4,2011_7";
我想将它变成一个二维数组,其中年份位于每个数组的第一个位置,而月份位于第二个位置。换句话说,我想最终得到这个:
var monthArray2d = [[2010,1],[2010,3][2011,4],[2011,7]];
我目前的做法是:
//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("_");
有没有办法压缩该代码,以便我永远不需要使用monthArray
var?
答案 0 :(得分:11)
您可以使用replace
来获得更紧凑的代码:
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)]);
})
或map,如果您的目标浏览器支持它:
monthArray2d = months.split(",").map(function(e) {
return e.split("_").map(Number);
})
基本上,第一个函数查找年/月模式“数字下划线数字”,并将每个找到的子字符串存储在数组中。当然,您可以使用其他分隔符而不是下划线。该函数不关心值的分隔符(逗号),因此它可以是任何东西。例如:
var months= "2010/1 ... 2010/3 ... 2011/4";
months.replace(/(\d+)\/(\d+)/g, function($0, $1, $2) {
monthArray2d.push([parseInt($1), parseInt($2)]);
})
答案 1 :(得分:7)
如果压缩是你所追求的:
var month_array = months.split(",").map(function(x){return x.split("_")});
答案 2 :(得分:3)
JavaScript是另一种动态语言,它的变量类型允许您随意保存任何内容。你做了正确的拆分,现在只用_
将该字符串拆分并放回去。
见这个例子:
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);
我不知道你不使用monthArray
是什么意思。上面的代码是你可以做的最少的,可能!
答案 3 :(得分:1)
拆分每个拆分是明智之举 - 你可以使用正则表达式来匹配下划线分隔的数字, 并将每对插入到自己的数组中,推送到月份数组 -
但我没有看到代码的改进:
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]]
*/