Эффективно заменить все акцентированные символы в строке? - PullRequest
102 голосов
/ 13 ноября 2008

Для реализации бедного человека почти -коллажно-правильной сортировки на стороне клиента мне нужна функция JavaScript, которая выполняет эффективную замену одного символа в строке.

Вот что я имею в виду (обратите внимание, что это относится к немецкому тексту, другие языки сортируются по-разному):

native sorting gets it wrong: a b c o u z ä ö ü
collation-correct would be:   a ä b c o ö u ü z

По сути, мне нужно, чтобы все вхождения "ä" данной строки были заменены на "a" (и т. Д.). Таким образом, результат собственной сортировки будет очень близок к тому, что ожидает пользователь (или что вернет база данных).

В других языках есть возможность сделать это: Поставки Python str.translate(), в Perl есть tr/…/…/, XPath имеет функцию translate(), ColdFusion имеет ReplaceList(). Но как насчет JavaScript?

Вот то, что у меня сейчас есть.

// s would be a rather short string (something like 
// 200 characters at max, most of the time much less)
function makeSortString(s) {
  var translate = {
    "ä": "a", "ö": "o", "ü": "u",
    "Ä": "A", "Ö": "O", "Ü": "U"   // probably more to come
  };
  var translate_re = /[öäüÖÄÜ]/g;
  return ( s.replace(translate_re, function(match) { 
    return translate[match]; 
  }) );
}

Для начала, мне не нравится тот факт, что регулярное выражение перестраивается каждый раз, когда я вызываю функцию. Я думаю, что закрытие может помочь в этом отношении, но я, кажется, не понимаю его по какой-то причине.

Может кто-нибудь придумать что-нибудь более эффективное?


Ответы ниже делятся на две категории:

  1. Функции замены строк различной степени полноты и эффективности (о чем я изначально просил)
  2. A позднее упоминание из String#localeCompare, которое широко поддерживается двигателями JS и может решить эту категорию проблем гораздо более элегантно.

Ответы [ 21 ]

0 голосов
/ 30 декабря 2016

Я решил это по-другому, если хотите.

Здесь я использовал два массива, где searchChars , содержащие данные для замены, и replaceChars , содержащие нужные символы.

var text = "your input string";
var searchChars = ['Å','Ä','å','Ö','ö']; // add more charecter.
var replaceChars = ['A','A','a','O','o']; // exact same index to searchChars.
var index;
for (var i = 0; i < text.length; i++) {
  if( $.inArray(text[i], searchChars) >-1 ){ // $.inArray() is from jquery.
    index = searchChars.indexOf(text[i]);
    text = text.slice(0, i) + replaceChars[index] + text.slice(i+1,text.length);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...