Sortierfunktion?
Markus
- javascript
0 Axel Richter0 Markus0 Axel Richter0 Markus0 Axel Richter0 Markus
HI
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.
Wien VII.
Wien VIII.
Wien X.
Wien XI.
Wien XII.
Wien XIII.
Wien XIV.
Wien XIX.
Wien XV.
Wien XVI.
Wien XVII.
Wien XVIII.
Wien XX.
Wien XXI.
Wien XXII.
Wien XXIII.
Wien-Umgebung
Wiener Neustadt
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.
Wien VII.
Wien VIII.
Wien IX.
Wien X.
Wien XI.
Wien XII.
Wien XIII.
Wien XIV.
Wien XV.
Wien XVI.
Wien XVII.
Wien XVIII.
Wien XIX.
Wien XX.
Wien XXI.
Wien XXII.
Wien XXIII.
Wien-Umgebung
Wiener Neustadt
Wie könnte ich das realisieren?
Um römischen Zahlen zu sortieren, musst Du diese in arabische Zahlen umwandeln und nach diesen dann sortieren.
http://www.free-solutions.de/js/tool_zahlen_roemisch-dezimal_converter.html
Insgesamt viel Arbeit in der sort-Routine:
function byIndex1(a,b) {
Deine Erklärung für die Sortierung hört sich nicht schlecht an:
Nur ich hätte eine Bitte dass du mir bei der Codeerstellung hilfst - weil es eigentlich ein wenig zu hoch für mich ist muß ich gestehen...
Wäre dir dafür sehr dankbar!
MFG
Markus
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
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 = 0for (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
Hallo Markus,
eigentlich wären ja die Bezirke bereits in den Arrays sortiert..
Ja, eben. ;-))???
Wenn Du die Bezirke erst im JavaScript-Quellcode selbst festlegst, wo kommt dann die Unordnung rein? Ich dachte, die werden so nacheinander in beliebiger Reihenfolge in eine Datenbank geschrieben. Wenn man es so macht, wie unten, dann kommt da eigentlich nichts durcheinander.
<html>
<head>
<title></title>
<script type="text/javascript">
<!--
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.";
function getBezirke(b) {
if(b) return Bundesland[b];
var tmp = new Array();
for(var x in Bundesland)
for(var i = 0; i<Bundesland[x].length; i++) tmp[tmp.length] = Bundesland[x][i];
return tmp;
}
function x() {
var tmp = getBezirke("Wien");
for(var i = 0; i<tmp.length; i++)
document.Formular.Bezirk.options[i+1] = new Option(tmp[i]);
}
//-->
</script>
</head>
<body>
<form name="Formular" action="" method="" target="">
<select name="Bezirk" size="1" style="width:200px;">
<option value="">
</select>
</form>
<script type="text/javascript">
<!--
x();
//-->
</script>
<noscript></noscript>
</body>
</html>
Die Frage ist also: Woher kommt bei Dir die Unordnung?
viele Grüße
Axel
HI Axel
Es kommt doch eine unordnung rein siehe unten..
Wenn Du die Bezirke erst im JavaScript-Quellcode selbst festlegst, wo kommt dann die Unordnung rein? Ich dachte, die werden so nacheinander in beliebiger Reihenfolge in eine Datenbank geschrieben. Wenn man es so macht, wie unten, dann kommt da eigentlich nichts durcheinander.
<html>
<head>
<title></title>
<script type="text/javascript">
<!--
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.";function getBezirke(b) {
if(b) return Bundesland[b];
var tmp = new Array();
for(var x in Bundesland)
for(var i = 0; i<Bundesland[x].length; i++) tmp[tmp.length] = Bundesland[x][i];
return tmp;
}
in diesem Fall stimmt es schon mit "wien"..
Aber ich brauche diese Funktion für alle Bezirke...
also:
var tmp = getBezirke(); //hier werden dann alle gelistet und werden so ins dropdown geschrieben wie ich es in die Arrays eingetragen habe...
function x() {
var tmp = getBezirke("Wien");
for(var i = 0; i<tmp.length; i++)
document.Formular.Bezirk.options[i+1] = new Option(tmp[i]);
}
//-->
</script>
</head>
<body>
<form name="Formular" action="" method="" target="">
<select name="Bezirk" size="1" style="width:200px;">
<option value="">
</select>
</form>
<script type="text/javascript">
<!--
x();
//-->
</script>
<noscript></noscript>
</body>
</html>
Siehe oben:
Die Frage ist also: Woher kommt bei Dir die Unordnung?
Danke
MFG
Markus
Hallo Markus,
Es kommt doch eine unordnung rein siehe unten..
in diesem Fall stimmt es schon mit "wien"..
Aber ich brauche diese Funktion für alle Bezirke...
also:var tmp = getBezirke(); //hier werden dann alle gelistet und werden so ins dropdown geschrieben wie ich es in die Arrays eingetragen habe...
Irgendwie verstehe ich Dein Ziel nicht. Du legst zunächst je Bundesland ein Array mit den Bezirken an. Dann willst Du alle Bezirke, unabhängig vom Bundesland, in _eine_ Liste schreiben? Wozu dann erst die Aufteilung? Und selbst wenn das einen Sinn ergäbe, würde die Liste _natürlich_ zunächst die Bezirke des zuerst festgelegten Bundeslandes enthalten, in der Reihenfolge, wie Du sie eingegeben hast, dann die Bezirke des zweiten Bundeslandes, in der Reihenfolge, wie Du sie eingegeben hast,..., dann die Bezirke des n. Bundeslandes, in der Reihenfolge, wie Du sie eingegeben hast. Sollen sich die Bezirke eines Bundeslandes jetzt in die Bezirke der anderen Bundesländer einsortieren? Die Logik ist mir zu hoch ;-))
viele Grüße
Axel
HI Axel!
Ich brauche diese Aufteilung weil ich 2 Dropdowns habe( Bezirke und Bundesländer) Wenn ich ein Bundesland auswähle kommen dann die entsprechenden Bezirke des jeweiligen Arrays rein.
Brauche aber alle Bezirke wenn ich "Alle" im Dropdown auswähle..
hat also schon einen Sinn.
var tmp = getBezirke().sort();
würde ja gehen.. bis auf die wiener Bezirke...mit den römischen Zahlen..
hab jetzt mal dein Zeug eingebaut...
var tmp = getBezirke().sort(byIndex);
und es funktioniert sogar..
muß noch weiter testen...
MFG
Markus
Irgendwie verstehe ich Dein Ziel nicht. Du legst zunächst je Bundesland ein Array mit den Bezirken an. Dann willst Du alle Bezirke, unabhängig vom Bundesland, in _eine_ Liste schreiben? Wozu dann erst die Aufteilung? Und selbst wenn das einen Sinn ergäbe, würde die Liste _natürlich_ zunächst die Bezirke des zuerst festgelegten Bundeslandes enthalten, in der Reihenfolge, wie Du sie eingegeben hast, dann die Bezirke des zweiten Bundeslandes, in der Reihenfolge, wie Du sie eingegeben hast,..., dann die Bezirke des n. Bundeslandes, in der Reihenfolge, wie Du sie eingegeben hast. Sollen sich die Bezirke eines Bundeslandes jetzt in die Bezirke der anderen Bundesländer einsortieren? Die Logik ist mir zu hoch ;-))
viele Grüße
Axel