Оптимизация замены нескольких специальных символов

133
16

Мне нужно заменить все символы специальных символов в строке с помощью javascript или jQuery.
Я уверен, что есть лучший способ сделать это.
Но в настоящее время я понятия не имею.
У кого-то появилась идея?

function Unaccent(str) {
var norm = new Array('À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï', 'Ð','Ñ','Ò','Ó','Ô','Õ','Ö','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß', 'à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ', 'ò','ó','ô','õ','ö','ø','ù','ú','û','ü','ý','ý','þ','ÿ');
var spec = new Array('A','A','A','A','A','A','A','C','E','E','E','E','I','I','I','I', 'D','N','O','O','O','0','O','O','U','U','U','U','Y','b','s', 'a','a','a','a','a','a','a','c','e','e','e','e','i','i','i','i','d','n', 'o','o','o','o','o','o','u','u','u','u','y','y','b','y');
for (var i = 0; i < spec.length; i++) {
str = replaceAll(str, norm[i], spec[i]);
}
return str;
}

function replaceAll(str, search, repl) {
while (str.indexOf(search) != -1) {
str = str.replace(search, repl);
}
return str;
}

спросил(а) 2021-01-25T23:03:35+03:00 4 месяца, 3 недели назад
1
Решение
99

Здесь версия с использованием карты поиска, которая работает немного более эффективно, чем вложенные циклы:

function Unaccent(str) {
var map = Unaccent.map; // shortcut
var result = "", srcChar, replaceChar;
for (var i = 0, len = str.length; i < len; i++) {
srcChar = str.charAt(i);
// use hasOwnProperty so we never conflict with any
// methods/properties added to the Object prototype
if (map.hasOwnProperty(srcChar)) {
replaceChar = map[srcChar]
} else {
replaceChar = srcChar;
}
result += replaceChar;
}
return(result);
}

// assign this here so it is only created once
Unaccent.map = {'À':'A','Á':'A','Â':'A'}; // you fill in the rest of the map

Рабочая демонстрация: http://jsfiddle.net/jfriend00/rRpcy/

FYI, поиск Google для "сгибания акцентов" возвращает много других реализаций (многие аналогичные, но также и некоторые с использованием регулярных выражений).


Здесь немного более высокая производительность (на 2,5 раза быстрее), которая может выполнять прямой индексный поиск акцентированных символов, а не необходимость поиска объектов:

function Unaccent(str) {
var result = "", code, lookup, replaceChar;
for (var i = 0, len = str.length; i < len; i++) {
replaceChar = str.charAt(i);
code = str.charCodeAt(i);
// see if code is in our map
if (code >= 192 && code <= 255) {
lookup = Unaccent.map.charAt(code - 192);
if (lookup !== ' ') {
replaceChar = lookup;
}
}
result += replaceChar;
}
return(result);
}

// covers chars from 192-255
// blank means no mapping for that char
Unaccent.map = "AAAAAAACEEEEIIIIDNOOOOO OUUUUY aaaaaaaceeeeiiiionooooo uuuuy y";

Рабочая демонстрация: http://jsfiddle.net/jfriend00/Jxr9u/

В этом jsperf версия поиска строк (второй пример) примерно в 2,5 раза быстрее.

ответил(а) 2021-01-25T23:03:35+03:00 4 месяца, 3 недели назад
62

Вы можете подготовить тип пары пар значений и через jquery каждый траверс этого массива.

Пример:

function Unaccent(str) {
var replaceString = {'À':'A','Á':'A','Â':'A'}; // add more

$.each(replaceString, function(k, v) {
var regX = new RegExp(k, 'g');
str = str.replace(regX,v);
});
}

Рабочая демонстрация

Удачи !!

ответил(а) 2021-01-25T23:03:35+03:00 4 месяца, 3 недели назад
63

Использование объекта в качестве карты - хорошая идея, но с учетом количества символов, которые вы заменяете, вероятно, хорошая идея предварительно инициализировать объект, чтобы его не нужно было повторно инициализировать каждый раз, когда функция получает (если вы используете эту функцию более одного раза):

var Unaccent = (function () {
var charMap = {'À':'A','Á':'A','Â':'A','Ã':'A','Ä':'A' /** etc. **/};
return function (str) {
var i, modified = "", cur;
for(i = 0; i < str.length; i++) {
cur = str.charAt(i);
modified += (charMap[cur] || cur);
}
return modified;
};
}());

Это позволит загружать тяжелую работу функции на время загрузки страницы (вы можете внести некоторые изменения, чтобы отложить ее до первого вызова функции, если хотите). Но из фактического вызова функции потребуется некоторое время обработки.

Возможно, в любом случае некоторые браузеры фактически оптимизируют эту часть, поэтому вы можете не видеть выгоды. Но в старых браузерах (где производительность вызывает большую озабоченность), вы, вероятно, увидите некоторую выгоду для предварительной обработки вашей карты символов.

ответил(а) 2021-01-25T23:03:35+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема