Hallo Markus,
Möchte eine spezielle Sortierung für ein Dropdown erstellen:
es gibt die Funktion sort() dann siehts so aus:
Bezirk
Wels
Wels-Land
Wien I.
Wien II.
Wien III.
Wien IV.
Wien IX.
Wien V.
Wien VI.
...
sollte aber so ausehen bzw. die römischen Zahlen:
Bezirk
Wels
Wels-Land
Wien I.
Wien II.
Wien III.
Wien IV.
Wien V.
Wien VI.
...
Wie könnte ich das realisieren?
Wie schon gesagt, meiner Meinung nach nur, nachdem die römischen Zahlen in arabische umgewandelt wurden. Ich habe da mal was gebastelt.
<html>
<head>
<title></title>
<script type="text/javascript">
<!--
function fromRoman(n)
//Mit freundlicher Unterstützung von http://www.free-solutions.de/js/tool_zahlen_roemisch-dezimal_converter.html
//Mit Dank an den Autor: mailto:paul@infotext.net?subject=Roman_Numerals
{
var r = 0
for (var c = 0; c < n.length; c++)
{
var chr = n.charAt(c).toLowerCase();
if (c < n.length - 1)
var next = n.charAt(c + 1).toLowerCase()
else
var next = '';
if (c > 0)
var prev = n.charAt(c - 1).toLowerCase()
else
var prev = '';
if (chr == 'i')
{
if (next == 'v')
r += 4
else
if (next == 'x')
r += 9
else
r += 1;
continue
}
if (chr == 'v')
{
if (prev != 'i')
r += 5;
continue
}
if (chr == 'x')
{
if (prev != 'i')
if (next == 'l')
r += 40
else
if (next == 'c')
r += 90
else
r += 10;
continue
}
if (chr == 'l')
{
if (prev != 'x')
r += 50;
continue
}
if (chr == 'c')
{
if (prev != 'x')
if (next == 'd')
r += 400
else
if (next == 'm')
r += 900
else
r += 100;
continue
}
if (chr == 'd')
{
if (prev != 'c')
r += 500;
continue
}
if (chr == 'm')
{
if (prev != 'c')
r += 1000;
continue
}
}
return r
}
var Bezirke = new Array(
"Zeischa Dorf",
"Wien I.",
"Wien II.",
"Wien III.",
"Wien XV.",
"Wien XVI.",
"Wien IV.",
"Wien IX.",
"Wien V.",
"Wien VII.",
"Wien VIII.",
"Wien X.",
"Wien MCX.",
"Wien XI. Geht das auch?",
"Wien VI. Ja, das geht.",
"Wien VI. Aber, das wird vernachlässigt.",
"Wien XII.",
"Wien XIII.",
"Wien XIV.",
"Wien XIX.",
"Wien XVII.",
"Wien XVIII.",
"Wien XX.",
"Wien XXI.",
"Wien XXII.",
"Wien XXIII.",
"Wien-Umgebung",
"Wiener Neustadt",
"Aachen",
"Wien Altstadt",
"Wels",
"Wels Land",
"Cottbus Land",
"Cottbus",
"Salzburg III.",
"Salzburg I.",
"Salzburg XX.",
"Salzburg V.",
"Salzburg IV.",
"Salzburg II.",
"Scheint zu gehen");
function byIndex(a,b) {
//Diese Sort-Funktion sortiert gleiche, zusammenhängende Texteinträge, denen,
//getrennt durch ein Leerzeichen, eine römische Zahl angefügt ist,
//aufsteigend nach diesen römischen Zahlen.
//Eine römische Zahl wird an einem Punkt an ihrem Ende erkannt.
//Muster-Eintrag:"Texteintrag IX."
//Der Eintrag muss am Anfang des gesamten Satements stehen.
//Nach der römischen Zahl stehende weitere Zeichen, werden nicht zur Sortierung herangezogen.
//Text nach " " aufsplitten
var tA = a.split(" ")[0];
var tB = b.split(" ")[0];
var rzA = a.split(" ")[1];
var rzB = b.split(" ")[1];
//Gibt es einen möglichen römischen Zahlenanteil?
if (rzA) {
//Ist es eine römische Zahl oder weiterer Text? Eine römisch Zahl hat hinten einen "."
if(rzA.charAt(rzA.length-1)==".") var aA = parseInt(fromRoman(rzA),10);
} else var aA = 0;
if (rzB) {
if(rzB.charAt(rzB.length-1)==".") var aB = parseInt(fromRoman(rzB),10);
} else var aB = 0;
//Nur, wenn nach zwei gleichen Texten, zwei römische Zahlen vorkamen, diese sortieren, sonst Texte sortieren.
if (tA == tB && aA > 0 && aB > 0) {
return aA - aB;
} else {
return (a<b)?-1:1;
}
}
Bezirke.sort(byIndex);
//-->
</script>
</head>
<body>
<script type="text/javascript">
<!--
for (var i = 0; i<Bezirke.length; i++) document.write(Bezirke[i]+"<br>");
//-->
</script>
<noscript></noscript>
</body>
</html>
Viel Zeit zum Testen hatte ich allerdings nicht. Es ist also eine Beta-Version ohne Gewähr! Eventuell sieht es sich ja noch Jemand an.
Eine Anregung hätte ich noch: Wenn die unsortierten Werte aus einer Datenbank kommen, solltest Du die Sortierung auf dem Server (PHP, PERL ...) machen und nicht mit Javascript. Perl hat eigentlich für fast alles schon fertige Module, eventuell gibts da sogar schon eins für römische Zahlen.
viele Grüße
Axel