【问题标题】:Javascript: split string into 2d arrayJavascript:将字符串拆分为二维数组
【发布时间】:2012-01-25 12:25:03
【问题描述】:

我有一串月份和年份:

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?

【问题讨论】:

    标签: javascript arrays string multidimensional-array split


    【解决方案1】:

    您可以使用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:我在帖子中添加了一些解释...如果您有任何问题,请告诉我。
    【解决方案2】:

    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】:

      如果你追求的是浓缩:

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

      【讨论】:

        【解决方案4】:

        拆分每个拆分是明智的做法- 您可以使用正则表达式来匹配下划线分隔的数字, 并将每一对插入其自己的数组中,并推送到月份数组中-

        但我没有看到您的代码有任何改进:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-14
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 2017-11-08
          • 1970-01-01
          • 1970-01-01
          • 2020-06-15
          相关资源
          最近更新 更多