2015-07-17 2 views
-1

У меня довольно большое приложение javascript/html, которое часто обновляется и получает много данных. Он работает очень быстро и плавно, но мне нужно теперь ввести функцию, которая будет обрабатывать любые входящие данные для специальных символов, и я боюсь, что будет много дополнительного времени обработки (а jsperf сейчас мертв).Замена пользовательских символов во время string.split()

Я сделаю запрос на получение файла .json через AJAX, а затем просто использую данные как есть. Но теперь мне нужно будет искать строки с # 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 запятой.

Спасибо за любой совет.

+1

Почему бы вам не заменить «# 2C» запятой, не используя 'split'? – Cristy

+0

Пожалуйста, проверьте обновленный ответ – Ananth

+0

@Cristy. Потому что это создаст другую запятую, которая создаст еще один индекс в массиве, который представляет собой совершенно разные данные. – BarryBones41

ответ

1

Edit: Я думаю, что это лучше:

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 
+0

Мне нужно заменить # 2C после раскола, иначе он изменит мои данные. # 2C по существу является экранированной запятой, так что .split() не интерпретирует ее. – BarryBones41

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 

Пара незначительных тангенциальных заметок о вашей функции «escapeCommas»: эта функция действительно выполняет логическое «un-escape», и поэтому имя функции может быть пересмотрено. Кроме того, если только вы не намерены заменять первое появление «# 2C» в каждом элементе, тогда вы должны использовать флаг «g» (глобальный), иначе появится элемент «C# 2Cd # 2Cde» c, д # 2CE».

+0

Извините, мне кажется, никто не понял, что мне нужно. Заменить после .split, чтобы не добавлять никаких новых запятых. – BarryBones41

+0

Спасибо за разъяснение; Теперь я обновил свой ответ, чтобы увеличить мой ответ о том, как вы можете «продлить или переписать .split», чтобы иметь функциональную раздельную реализацию, которая точно соответствует вашим потребностям. –

Смежные вопросы