Markus: Sortierfunktion?

Beitrag lesen

HI Axel

Hab die Bezirke so deffiniert:

Bundesland = new Array();

Bundesland['Vorarlberg'] = new Array();

Bundesland.Vorarlberg[0] = "Bludenz";
  Bundesland.Vorarlberg[1] = "Bregenz";
  Bundesland.Vorarlberg[2] = "Dornbirn";
  Bundesland.Vorarlberg[3] = "Feldkirch";

Bundesland['Wien'] = new Array();

Bundesland.Wien[0] = "Wien I.";
  Bundesland.Wien[1] = "Wien II.";
  Bundesland.Wien[2] = "Wien III.";
  Bundesland.Wien[3] = "Wien IV.";
  Bundesland.Wien[4] = "Wien V.";
  Bundesland.Wien[5] = "Wien VI.";
  Bundesland.Wien[6] = "Wien VII.";
  Bundesland.Wien[7] = "Wien VIII.";
  Bundesland.Wien[8] = "Wien IX.";
  Bundesland.Wien[9] = "Wien X.";
  Bundesland.Wien[10] = "Wien XI.";
  Bundesland.Wien[11] = "Wien XII.";
  Bundesland.Wien[12] = "Wien XIII.";
  Bundesland.Wien[13] = "Wien XIV.";
  Bundesland.Wien[14] = "Wien XV.";
  Bundesland.Wien[15] = "Wien XVI.";
  Bundesland.Wien[16] = "Wien XVII.";
  Bundesland.Wien[17] = "Wien XVIII.";
  Bundesland.Wien[18] = "Wien XIX.";
  Bundesland.Wien[19] = "Wien XX.";
  Bundesland.Wien[20] = "Wien XXI.";
  Bundesland.Wien[21] = "Wien XXII.";
  Bundesland.Wien[22] = "Wien XXIII.";

[usw...] Alle anderen Bundesländer und Bezirke..

eigentlich wären ja die Bezirke bereits in den Arrays sortiert..

mit dieser Funktion bekomme ich dann alle Bezirek raus:

function getBezirke(b)
{
    if(b) return Bundesland[b];
    var tmp = new Array();
    for(var x in Bundesland)
    for(var i = 0; Bundesland[x][i]; i++) tmp[tmp.length] = Bundesland[x][i];
    return tmp;

//Mit dieser funktion schreibe ich dann die Bezirke ins Dropdown da müßte dann das sort rein...
}
function x()
{
var tmp = getBezirke(); //.sort(byIndex);

for(var i = 0; tmp[i]; i++)
document.Formular.Bezirk.options[i+1] = new Option(tmp[i]);
 }

Muß deine Variante mal probieren wie ich die da einbauen könnte?

Danke

MFG
Markus
// Alle Bundesländer und Bezirke..
  »»

<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