Axel Richter: Sortierfunktion?

Beitrag lesen

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