Для плохой реализации реалистичной сортировки с близкой сортировкой на стороне клиента мне нужна функция 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 двигатели и могли бы решить эту категорию проблемы гораздо элегантнее.