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