将CSV字符串转换为不带.split()的数组

时间:2015-11-18 17:09:34

标签: javascript parseint

我正在尝试提出一个函数,该函数将接受任何字符串并输出数字和字符串数组而不使用.split()。下面是它需要传递的测试和当前通过测试的函数。我很好奇其他人如何解决这个问题。

function csvParse(inputString) {
   var outputArray = [];
   var inputArray = inputString.split(',');
   for (var i =0; i < inputArray.length; i++) {
     if (!Number.isNaN(+inputArray[i])) {
       outputArray.push(+inputArray[i]);
   } else {
     outputArray.push(inputArray[i].replace(/['"]+/g,'').trim());
   }
   }
   return outputArray;
};

describe('CSV Parse', function() {
  it('should parse a string of integers correctly', function() {
    var input = '3,7,9,1,25';
    var output = [ 3, 7, 9, 1, 25 ];
    expect(csvParse(input)).to.deep.equal(output);
  });
  it('should parse a string of strings correctly', function() {
    var input = '"3","7","9","1","25"';
    var output = ["3", "7", "9", "1", "25"];
    expect(csvParse(input)).to.deep.equal(output);
  });
  it('should parse a string of integers and strings correctly', function() {
    var input = '1, "one", 2, "two", 3, "three"';
    var output = [1, "one", 2, "two", 3, "three"];
    expect(csvParse(input)).to.deep.equal(output);
  });
});

2 个答案:

答案 0 :(得分:2)

基本的JS解决方案只是替换你提出的分割方法(小提琴here

function dumbComaSplit(inputString) {
   var strArray = [];
   var tmpStr = "";
   for (var i = 0; i < inputString.length; i++) {
        if (inputString.charAt(i) == ',') {
            strArray.push(tmpStr);
            tmpStr = "";
            continue;
        }
        tmpStr += inputString.charAt(i);
    }
    strArray.push(tmpStr);
    return strArray;
};

function csvParse(inputString) {
   var outputArray = [];
   var inputArray = dumbComaSplit(inputString);
   for (var i =0; i < inputArray.length; i++) {
     if (!Number.isNaN(+inputArray[i])) {
       outputArray.push(+inputArray[i]);
   } else {
     outputArray.push(inputArray[i].replace(/['"]+/g,'').trim());
   }
   }
   return outputArray;
};

答案 1 :(得分:1)

如果您确实想要在没有spilt的情况下解析CSV格式,可以使用新的ECMAScript 6 Template Strings功能进行解析。

基本是我们用模拟,表达式替换CSV ${b}并将字符串转换为模板字符串。然后在使用tag功能时对其进行评估。这将为我们创建阵列。

Here是小提琴。

function csvParse(inputString) {

     b = null;       //dummy variable

     //Prepare the notation to be a TemplateString. Use var b in a dummy expression
     inputString = "`" + inputString.replace(/,/g, '${b}') + "`";


     //Evaluate. Note that we use a tag function inside the evaluation to create the array
     //We also pass the string as a  Template String to evaluate. This is optional
     fn = new Function(`function tag(inputArray) {
                           return inputArray;
                        } 

                        return tag  ${inputString}  `);


     //Return the array         
     return fn().raw;

};


console.log(csvParse("power,of,es6")); 

split是要走的路。但这就是你要找的答案。