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