Эффективно заменить все акцентированные символы в строке?


для реализации бедного человека возле - сортировка-правильная сортировка на стороне клиента мне нужна функция 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]; 
  }) );
}

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

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


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

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

20 ответов: