1

我有一个大字符串,它使用 $.ajax 请求穿过电线。我可以以任何必要的方式格式化字符串,目前使用 % 作为行分隔符, , 作为项目分隔符。考虑到性能在我的应用程序中如此重要,是否有人有更快的方法来执行以下操作?谢谢你

function convertCSV(s) {
    var lines = s.split("%");
    var items, sym, arr = [];

    for (var x = 0, len = lines.length; x < len; x++) {
        items = lines[x].split(",");
        sym = {};
        sym.time = +items[0];
        sym.num1 = +items[1];
        sym.num2 = +items[2];
        sym.a1 = +items[3];
        sym.b1 = +items[4];
        sym.c1 = +items[5];
        sym.d1 = +items[6];
        sym.e1 = +items[7];
        sym.f1 = +items[8];
        sym.g1 = +items[9];
        sym.h1 = +items[10];
        sym.l1 = +items[11];
        arr[x] = sym;
    }

    return arr;
}
4

3 回答 3

2

也许 JSON 对您通过网络发送的内容进行编码,然后在收到后进行 JSON 解码。

于 2013-08-31T05:21:10.537 回答
1

如果您关心速度,您可能应该创建一个简单的解析器来逐个字符地解析字符串。

这是一个简单的例子:

演示

function convertCSV(s, properties) {
    var result = [],
        i = 0,
        len = s.length,
        propIndex = 0,
        row = {},
        val = '',
        c;

    for (; i < len; i++) {
        switch(c = s[i]) {
            case ',':
                row[properties[propIndex++]] = val;
                val = '';
                break;
            case '%':
                result.push(row);
                row[properties[propIndex++]] = val;
                propIndex = 0;
                row = {};
                val = '';
                break;
            default:
                val += c;
        }
    }

    return result;
}

console.log(convertCSV('a,b,c%d,e,f%h,i,j%', ['a', 'b', 'c']));

编辑:

我进行了一些性能测试,看来我毕竟是不对的。您当前的方法实际上是第二快的,但最快的方法似乎是使用正则表达式。我必须说,我很惊讶简单的解析器不是最快的解决方案。

性能测试

var rx = /(.*?),(.*?),(.*?)%/g,
    result = [],
    match;

while (match = rx.exec(s)) {
    result.push({
        a: match[1],
        b: match[2],
        c: match[3]
    });
}

console.log(result);
于 2013-08-31T06:17:32.270 回答
1

(次要)优化:

function convertCSV(s) {
  var lines = s.split("%");
  var items, arr = [];
  while ((items = lines.shift()) && (items = items.split(",")) {
    arr.push({ 
        time : +items[0], num1 : +items[1],  num2 : +items[2],
        a1   : +items[3], b1   : +items[4],  c1   : +items[5],
        d1   : +items[6], e1   : +items[7],  f1   : +items[8],
        g1   : +items[9], h1   : +items[10], l1   : +items[11]
     });
  }
  return arr;
}

可能值得尝试Array.shift()Array.pop()

于 2013-08-31T05:42:30.380 回答