Für die Umsetzung eines armen Mannes von in der Nähe von -korrekte Sortierung auf der Client-Seite Ich brauche eine JavaScript-Funktion, die effizient Ersetzung einzelner Zeichen in einer Zeichenkette.
Hier ist, was ich meine (beachten Sie, dass dies für den deutschen Text gilt, andere Sprachen sortieren anders):
native sorting gets it wrong: a b c o u z ä ö ü
collation-correct would be: a ä b c o ö u ü z
Im Grunde muss ich alle Vorkommen von "ä" in einer gegebenen Zeichenkette durch "a" (und so weiter) ersetzen. Auf diese Weise würde das Ergebnis der nativen Sortierung sehr nahe an dem liegen, was ein Benutzer erwarten würde (oder was eine Datenbank zurückgeben würde).
In anderen Sprachen ist dies möglich: Python-Lieferungen str.translate()
, in Perl gibt es tr/…/…/
, XPath hat eine Funktion translate()
, ColdFusion hat ReplaceList()
. Aber was ist mit JavaScript?
Hier ist, was ich im Moment habe.
// 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];
}) );
}
Zunächst einmal gefällt mir nicht, dass die Regex bei jedem Funktionsaufruf neu aufgebaut wird. Ich schätze, dass eine Schließung in dieser Hinsicht helfen kann, aber ich scheine aus irgendeinem Grund nicht den Dreh raus zu haben.
Fällt jemandem etwas Effizienteres ein?
Die folgenden Antworten fallen in zwei Kategorien:
- Funktionen zur Ersetzung von Zeichenketten mit unterschiedlichem Grad an Vollständigkeit und Effizienz (worum ich ursprünglich gebeten hatte)
- A späte Erwähnung von
String#localeCompare
die jetzt weitgehend unterstützt unter den JS-Engines (nicht so sehr zum Zeitpunkt der Frage) und könnte diese Art von Problem viel eleganter lösen.
12 Stimmen
Sie liegen falsch mit Ihrer Annahme, dass ein Benutzer erwartet, dass "ä" mit "a" sortiert wird. Das schwedische Alphabet hat 29 Buchstaben: abcdefghijklmnopqrstuvwxyzåäö und das dänische/norwegische auch: abcdefghijklmnopqrstuvwxyzæøå. Die erwartete Reihenfolge ist: "Apelsin", "Banan", "Äpple".
1 Stimmen
Ich weiß. Die Lösung war für die Sortierung deutscher Texte gedacht. Auch dort ist sie nicht richtig aber gut genug für den Anwendungsfall. Diese Frage war nie als Suche nach dem "löst alle Probleme"-Algorithmus gedacht.
1 Stimmen
Ich habe die Frage ein wenig umformuliert, um das von Anfang an klar zu machen.
1 Stimmen
@Tomalak: Ich bin auf deine Frage gestoßen, als ich einem Link von einer anderen Frage über "u" und "ü" gefolgt bin und musste widersprechen. Aber da Sie nun klargestellt haben, dass es um Deutsch ging, habe ich nichts weiter zu beanstanden.
4 Stimmen
@some: Ich ziehe eine kurze Diskussion in den Kommentaren einem Down-Vote jederzeit vor. Leider gibt es hier auch Leute, die erst abstimmen und dann Fragen stellen (wenn überhaupt). Konsequenz: Ihr Kommentar wurde gewürdigt :)
0 Stimmen
@Tomalak:Leider gibt es Leute, die ohne ersichtlichen Grund abwerten, selbst bei korrekten Antworten und kristallklaren Fragen Ich frage mich, ob sie bemerkt haben, dass sie selbst einen Punkt verlieren Ich ziehe es vor, stattdessen einen Kommentar zu hinterlassen, damit der Autor Klarstellungen/Korrekturen vornehmen kann. IMHO ist das besser.
1 Stimmen
Nur damit Sie es wissen, ich habe einen Fork von tablesorter, in dem ich die Original
sortLocaleCompare
Option um diese akzentuierten Zeichenfolgen automatisch zu ersetzen; siehe diese Demo für weitere Einzelheiten. Wenn das immer noch nicht funktioniert, dann schauen Sie doch mal unter diese Demo die den Standardtextsortierer durch sugar.js ersetzt.0 Stimmen
Danke @Mottie. (Ich glaube
sortLocaleCompare
gab es noch nicht, als ich diese Frage zum ersten Mal schrieb).0 Stimmen
Tatsächlich gab es diese Funktion bereits in v2.0.5 (undokumentiert), und alles, was sie tat, war
return a.localeCompare(b);
innerhalb einer Sorte.0 Stimmen
Siehe eine neuere Lösung stackoverflow.com/a/18391901/759452
1 Stimmen
Es gibt ein NPM-Paket, das genau dies tut, github.com/andrewrk/node-diacritics .
1 Stimmen
Ist damit Ihre Frage beantwortet? Akzente/Diakritische Zeichen in einer Zeichenkette in JavaScript entfernen