在string.split()期间替换自定义字符

时间:2015-07-17 21:01:29

标签: javascript json string

我有一个相当大的javascript / html应用程序,它经常更新并接收大量数据。它运行得非常快速和顺利,但我现在需要引入一个函数,它必须处理特殊字符的任何传入数据,我担心这会有很多额外的处理时间(而jsperf目前有点死)。

我将通过AJAX请求获取.json文件,然后直接使用数据。但现在我需要注意#2C(十六进制逗号)的字符串,因为所有传入的数据都是以逗号分隔的值。

File.json中的

{
  names: "Bob, Billy",
  likes : "meat,potatoes
}

现在我需要

{
  names: "Bob, Billy",
  likes : "meat#2Cbeear#2Cwine,potatoes
}

其中#2C(逗号的十六进制)是字符串中的逗号。

我有这个代码可以正常工作

var str = "a,b,c#2Cd";

var arr = str.split(',');

function escapeCommas(arr) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i].indexOf("#2C") !== -1) {
            var s = arr[i].replace("#2C", ',');
            arr[i] = s;
        }
    }
    return arr;
}

console.log(escapeCommas(arr));

http://jsfiddle.net/5hogf5me/1/

我有很多函数可以将JSON数据处理为

var name = str.split(',')[i];

我想知道如何扩展或重写.split以自动用逗号替换#2C。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

编辑:我认为这更好:

var j = {
  names: "Bob, Billy",
  likes : "meat#2Cpotatoes"
};
var result = j.likes.replace(/#2C/g, ',');
// j.likes.replace(/#2C/ig, ','); - if you want case insensitive
// and simply reverse parameters if you want
console.log(result);

这是我最初的做法:

var j = {
  names: "Bob, Billy",
  likes : "meat,potatoes"
}
var result = j.likes.split(",").join("#2C")

console.log(result);
// meat#2Cpotatoes

或者如果你反过来的话:

var j = {
  names: "Bob, Billy",
  likes : "meat#2Cpotatoes"
}
var result = j.likes.split("#2C").join(",")

console.log(result);
// meat,potatoes

答案 1 :(得分:0)

[已更新以反映反馈] - 尝试http://jsfiddle.net

var str = 'a,b,c#2Cd,e#2Cf#2Cg';

alert(str.split(',').join('|')); // Original

String.prototype.native_split = String.prototype.split;
String.prototype.split = function (separator, limit) {
    if ((separator===',')&&(!limit)) return this.replace(/,/g,'\0').replace(/#2C/gi,',').native_split('\0');
    return this.native_split(separator, limit);
}
alert(str.split(',').join('|')); // Enhanced to un-escape "#2C" and "#2c"

String.prototype.split = String.prototype.native_split;
alert(str.split(',').join('|')); // Original restored

关于你的功能和#34; escapeCommas&#34;的几个小的切线说明:这个功能真的是一个合乎逻辑的&#34; un-escape&#34;因此可能会重新考虑函数名称。此外,除非您打算只替换第一次出现的&#34;#2C&#34;在每个项目中,你应该使用&#34; g&#34; (全局)标志,否则为项目&#34; c#2Cd#2Cde&#34;会出来&#34; c,d#2Ce&#34;。