使用空值构建数组

时间:2012-10-27 17:57:52

标签: javascript

下面的函数将csv文件解析为数组,因此它看起来像

[[1,56.79],[2,57.50],[3,71.60],[4,69.10]]

function CSVToArray (csvString) {

    var arrData = [[]];

    var rows = csvString.match(/[^\r\n]+/g);
    var len = rows.length
    for (var i=0; i<len; ++i) 
    {

        var cols = rows[i].split(",")
        arrData[ arrData.length - 1 ].push( parseFloat(cols[0]) );
        arrData[ arrData.length - 1 ].push( parseFloat(cols[1]) );
        if (i<(len-1))
        {
            arrData.push( [] );
        }
    }

    return( arrData );
};

我试图修改它,这样如果没有类似

的数据,我可以在数组中有空值

[[1,56.79],[2,57.50],null,[3,71.60],null,[4,69.10]]

我已经尝试了以下但无法使其正常工作

function CSVToArray (csvString) {

    var arrData = [[]];

    var rows = csvString.match(/[^\r\n]+/g);
    var len = rows.length
    for (var i=0; i<len; ++i) 
    {

        var cols = rows[i].split(",")
        if (cols[1] != "")
        {
        arrData[ arrData.length - 1 ].push( parseFloat(cols[0]) );
        arrData[ arrData.length - 1 ].push( parseFloat(cols[1]) );
        arrData.push( [] );
        }
        else
        {
        arrData.push( null);
        }
    }

    return( arrData );
};

有人可以告诉我如何在数组中得到null而不是null吗?

基本上,我试图让数据结构正确,以便能够执行此操作http://jsfiddle.net/KhpCE/1/

3 个答案:

答案 0 :(得分:2)

使用此:

function CSVToArray (csvString) {
    var arrData = [];
    var rows = csvString.split(/\r?\n/);
    // console.log(rows)
    var len = rows.length
    for (var i=0; i<len; ++i) 
    {
        var cols = rows[i].split(",")
        // console.log(cols)
        var temp = []
        if (cols.length == 2 && cols[1] != "" && cols[0] != "")
        {
          temp.push( parseFloat(cols[0]) );
          temp.push( parseFloat(cols[1]) );
        }
        else
        {
          temp = null;
        }
        arrData.push(temp);
    }
    return( arrData );
};

答案 1 :(得分:1)

不是事先为下一个项目推送一个空数组,只需创建每个项目的数组并推送它,然后推送空值而不是项目很简单:

function CSVToArray (csvString) {

  // an array without the prefilled empty item array
  var arrData = [];

  var rows = csvString.match(/[^\r\n]+/g);
  var len = rows.length
  for (var i=0; i<len; ++i) {
    var cols = rows[i].split(",");
    if (cols[1] != "") {
      // create an array and push it
      arrData.push([
        parseFloat(cols[0]),
        parseFloat(cols[1])
      ]);
    } else {
      arrData.push(null);
    }
  }

  return arrData;
}

答案 2 :(得分:1)

这是困扰你的match/[^\r\n]+/g上的匹配结果会丢失csvString的空行。我建议在这里使用split

此外,您的代码看起来很笨重。如何使用Array.map 1

function CSVToArray(csvString) {
    var rows = csvString.split(/\n|\r\n/);
      return rows.length ? [rows.map(function(s){
         var cols = s.split(",").map(function(v){return Number(v)||null;});
         return cols.length===2 ? cols: null;
      })] : [];
};
//usage example
CSVToArray('1,2.1\n\n23.2\n3,4\n5.34,6');
//=> [[2,2.1],null,null,[3,4],[5.34,6]]

1 Here您可以找到旧版浏览器的Array.map垫片