Для плохой реализации реалистичной сортировки с близкой сортировкой на стороне клиента мне нужна функция 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]; 
  }) );
}
Для начала мне не нравится тот факт, что регулярное выражение перестраивается каждый раз, когда я вызываю функцию. Я думаю, что закрытие может помочь в этом отношении, но по какой-то причине я, похоже, не понимаю его.
Может кто-нибудь подумать о чем-то более эффективном?
Ответы ниже подразделяются на две категории:
- Функции замены строк различной степени полноты и эффективности (о чем я изначально просил)
-  A последнее упоминание String#localeCompare, которое широко поддерживается среди JS двигатели и могли бы решить эту категорию проблемы гораздо элегантнее.
