Efficacement remplacer tous les caractères accentués dans une chaîne de caractères?

Pour un homme pauvre de la mise en œuvre de près de-classement-tri correct sur le côté client, j'ai besoin d'une fonction JavaScript qui ne efficace seul remplacement de caractères dans une chaîne.

Voici ce que je veux dire (notez que cela s'applique au texte allemand, autres langues trier différemment):

natif de tri s'il se trompe: a b c o u z ä ö ü 
classement correct serait: un ä b c o ö u ü z 

En gros, j'ai besoin de toutes les occurrences de "ä" d'une chaîne donnée remplacé par "a" (et ainsi de suite). De cette façon, le résultat de natif de tri serait très proche de ce qu'un utilisateur pourrait s'attendre (ou ce qu'est une base de données serait de retour).

D'autres langues ont des installations de le faire: Python fournitures str.translate(), dans Perl n'est tr/.../.../, XPath est une fonction translate(), ColdFusion a ReplaceList(). Mais qu'en JavaScript?

Voici ce que j'ai droit maintenant.

//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]; 
  }) );
}

Pour commencer, je n'aime pas le fait que la regex est reconstruit à chaque fois que j'appel de la fonction. Je suppose que la fermeture peut aider à cet égard, mais je ne semble pas obtenir le blocage de celui-ci pour une raison quelconque.

Quelqu'un peut-il penser à quelque chose de plus efficace?


Réponses ci-dessous se divisent en deux catégories:

  1. Chaîne de fonctions de remplacement de divers degrés de l'intégrité et de l'efficacité (ce que j'ai été à l'origine de demander à propos de)
  2. Un la fin de mentionner de String#localeCompare, qui est largement soutenu parmi les moteurs JS et pourrait résoudre cette catégorie de problème beaucoup plus élégamment.
  • Vous êtes mal dans votre hypothèse que l'utilisateur s'attend à "ä" pour être trié, "un". Le suédois alphabet a 29 lettres: abcdefghijklmnopqrstuvwxyzåäö et le danois/norvégien: abcdefghijklmnopqrstuvwxyzæøå. L'ordre attendu est: "Apelsin", "Banane", "Äpple".
  • Je sais. La solution a été prévu pour trier texte allemand. Même là, il n'est pas correct, mais assez bon pour le cas d'utilisation. Cette question n'a jamais été destiné à être la recherche de la "résout tous les problèmes" de l'algorithme.
  • J'ai reformulé la question un peu pour que cela soit clair dès le début.
  • J'ai trouvé votre question lorsque j'étais en suivant un lien depuis une autre question à propos de "u" et "ü" et avait pour objet. Mais maintenant que vous avez précisé que c'était pour l'allemand, je n'ai rien à objecter.
  • Je préfère une courte discussion dans les commentaires sur un vote à tout moment. Malheureusement il y a des gens ici que le vote d'abord et poser des questions plus tard (le cas échéant). Conséquence: Votre commentaire a été appréciée. 🙂
  • il y a des gens qui downvote pour aucune raison apparente,même les réponses correctes et les eaux limpides de questions... je me demande si l'remarqué qu'ils ne se perd 1 point?Je préfère laisser un commentaire au lieu donc l'auteur peut apporter des précisions/corrections. À mon humble avis c'est mieux.
  • Juste pour que vous le savez, j'ai une fourchette de tablesorter dans lequel j'ai modifié les original sortLocaleCompare option pour remplacer ces accentué les chaînes automatiquement; veuillez consulter la cette démo pour plus de détails. Si cela ne fonctionne pas pour vous, alors découvrez cette démo qui remplace le texte par défaut en mode trieuse avec sugar.js.
  • Merci @Mottie. (Je crois sortLocaleCompare n'existaient même pas quand j'ai écrit pour la première fois à cette question.)
  • En fait, il n'existe pas dans la v2.0.5 (sans-papiers) et tout ce qu'il a fait a été return a.localeCompare(b); dans une sorte.
  • voir plus récente solution de stackoverflow.com/a/18391901/759452
  • Il est MNP package qui fait juste cela, github.com/andrewrk/node-diacritics.

InformationsquelleAutor Tomalak | 2008-11-13