Javascript:将字符串拆分为二维数组

9

我有一个包含月份和年份的字符串:

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变量?
4个回答

12

您可以使用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)]);
})

你好,能否详细说明一下第一个函数?如果分隔符不是“_”和“,”而是其他字符,比如“x”和“y”,该怎么让它工作呢? - JBJ
1
@JBJ:我在帖子中添加了一些解释……如果你有问题,请告诉我。 - georg

10
如果你想要压缩(代码),可以使用以下方法:
var month_array = months.split(",").map(function(x){return x.split("_")});

5

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”是什么意思。上面的代码可能已经是你能做到的最少了!

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接