Announcement

Collapse
No announcement yet.

JS Sortierfunktion

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • JS Sortierfunktion

    Guten Abend zusammen,

    Ich hab' mir anhand einer Vorlage einen JS-Code gebastelt, welcher innherhalb einer HTML-Datei eine Tabelle erzeugt, die per Klick auf einen entsprechenden Button entweder nach Spalte 1 oder Splate 2 (jeweils ab- oder aufsteigend) alphabetisch sortiert wird.

    Die Sortierung nach Spalte 1 ("Name") funktioniert einwandfrei, wenn ich nun aber nach Spalte 2 ("Ort") sortieren will, so werden alle Einträge gemischt, kommen mehrfach oder auch garnichtmehr in der Tabbelle vor.

    Der gesamte Code lautet wie folgt:

    Code:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
    
    <style type="text/css">
    #Kopfbereich { position:absolute; top:20px; left:30px; }
    #Tabelle { position:absolute; top:100px; left:30px; }
    body { background-color:#FFFFFF; }
    h1,h2,h3,p,ul,ol,li,td,th { font-family:Arial,sans-serif; color:black; }
    h1 { font-size:24px; margin-top:4px; margin-bottom:4px; margin-left:6px; }
    p,ul,ol,li,td,th { font-size:13px; color:#000000; }
    th,td { padding:1px; }
    </style>
    <script type="text/javascript">
    
    <!--
    
    var Tabellendaten = new Array(
    "Person A", "Ort H",
    "Person B", "Ort F",
    "Person C", "Ort F",
    "Person D", "Ort K",
    "Person E", "Ort F",
    "Person F", "Ort J",
    "Person G", "Ort K"
    );
    
    var sortierte_Tabellendaten = new Array(Tabellendaten.length);
    
    var Spaltenueberschriften = new Array(
    "Name",
    "Ort"
    );
    
    var Spalten = Spaltenueberschriften.length;
    var Zeilen = Tabellendaten.length / Spalten;
    
    var Spaltenueberschriftformatierungen = new Array(
     "width=\"150\" valign=\"top\" style=\"text-align:left; border:solid 1px #808080\"",
     "width=\"50\" valign=\"top\" style=\"text-align:left; border:solid 1px #808080\""
    );
    
    var Spaltenformatierungen = new Array(
     "width=\"150\" style=\"text-align:left; border:solid 1px #808080\"",
     "width=\"50\" style=\"font-family:Courier New,courier; text-align:left; border:solid 1px #808080\""
    );
    
    var Spaltensortierungen = new Array(
     "alphabetisch","alphabetisch"
    );
    
    var Tabellenformatierung = "border=\"1\" style=\"border:solid 1px #808080\" cellspacing=\"0\"";
    var Ordinalzahlenspalte = 1;
    var Ordinalzahlenspaltenformatierung = "width=\"20\" style=\"border:solid 1px #808080\"";
    
    var IconNormalAuf = "&dArr;";
    var IconNormalAb = "&uArr;";
    var IconSortiertAuf = "&dArr;";
    var IconSortiertAb = "&uArr;";
    
    var Sortierzeile = "";
    
    function Erzeuge_Sortierzeile(Nummer,Richtung) {
     Sortierzeile = "<tr>";
     if(Ordinalzahlenspalte)
       Sortierzeile += "<th " + Ordinalzahlenspaltenformatierung + "> <\/th>";
     for(var j = 0; j < Spalten; ++j) {
      Sortierzeile += "<th " + Spaltenformatierungen[j] + ">";
      if(Richtung == "aufsteigend" && j == Nummer) {
       Sortierzeile += IconSortiertAuf + " ";
       Sortierzeile += "<a href=\"javascript:Sortiere_nach_Spalte(" + j + ",'" + Spaltensortierungen[j] + "','absteigend')\">" + IconNormalAb + "</a>";
      }
      else if(Richtung == "absteigend" && j == Nummer) {
       Sortierzeile += "<a href=\"javascript:Sortiere_nach_Spalte(" + j + ",'" + Spaltensortierungen[j] + "','aufsteigend')\">" + IconNormalAuf + "</a>";
       Sortierzeile += " " + IconSortiertAb;
      }
      else {
       Sortierzeile += "<a href=\"javascript:Sortiere_nach_Spalte(" + j + ",'" + Spaltensortierungen[j] + "','aufsteigend')\">" + IconNormalAuf + "</a> ";
       Sortierzeile += "<a href=\"javascript:Sortiere_nach_Spalte(" + j + ",'" + Spaltensortierungen[j] + "','absteigend')\">" + IconNormalAb + "</a><\/td>";
      }
     Sortierzeile += "<\/th>";
     }
     Sortierzeile += "<tr>";
    }
    
    function Sortiere_nach_Spalte(Nummer,Art,Richtung) {
     var Spaltendaten = new Array();
     var Vergleichsdaten = new Array();
     var SortierIndex = new Array();
     for(var i = 0; i < Zeilen; ++i)
      Spaltendaten[i] = Vergleichsdaten[i] = Tabellendaten[i * Spalten + Nummer];
     if(Art == "alphabetisch") Spaltendaten.sort();
     if(Art == "numerisch") Spaltendaten.sort(Numsort);
     if(Richtung == "absteigend") Spaltendaten.reverse();
     for(i = 0; i < Zeilen; ++i)
      for(var j = 0; j < Zeilen; ++j)
       if(Spaltendaten[i] == Vergleichsdaten[j])
        SortierIndex[i] = j;
     var Speicher;
     for(i = 0; i < Zeilen; ++i)
      for(j = 0; j < Spalten; ++j)
       sortierte_Tabellendaten[i * Spalten + j] = Tabellendaten[SortierIndex[i] * Spalten + j];
     Erzeuge_Sortierzeile(Nummer,Richtung);
     Schreibe_Tabelle(sortierte_Tabellendaten);
    }
    
    function Schreibe_Tabelle(Array) {
     var Tabelleninhalt = "";
     Tabelleninhalt += "<table " + Tabellenformatierung + ">";
     Tabelleninhalt += "<thead><tr>";
     if(Ordinalzahlenspalte)
       Tabelleninhalt += "<th " + Ordinalzahlenspaltenformatierung + "> <\/th>";
     for(var j = 0; j < Spalten; ++j)
      Tabelleninhalt += "<th " + Spaltenueberschriftformatierungen[j] + ">" + Spaltenueberschriften[j] + "<\/th>";
     Tabelleninhalt += "<\/tr>";
     Tabelleninhalt += Sortierzeile;
     Tabelleninhalt += "<\/thead>";
     Tabelleninhalt += "<tfoot><\/tfoot>";
     Tabelleninhalt += "<tbody>";
     for(var i = 0; i < Zeilen; ++i) {
      Tabelleninhalt += "<tr>";
      if(Ordinalzahlenspalte)
       Tabelleninhalt += "<td " + Ordinalzahlenspaltenformatierung + ">" + (i+1) + ".<\/td>";
      for(var j = 0; j < Spalten; ++j)
       Tabelleninhalt += "<td " + Spaltenformatierungen[j] + ">" + Array[i * Spalten + j] + "<\/td>";
      Tabelleninhalt += "<\/tr>";
     }
     Tabelleninhalt += "<\/tbody>";
     Tabelleninhalt += "<\/table>";
     if(document.getElementById)
      document.getElementById("Tabelle").innerHTML = Tabelleninhalt;
     else if(document.all)
      document.all.Tabelle.innerHTML = Tabelleninhalt;
     else if(document.layers) {
      document.Tabelle.document.open();
      document.Tabelle.document.write(Tabelleninhalt);
      document.Tabelle.document.close();
     }
    }
    
    function Numsort(a,b)
    { return a-b; }
    </script>
    <title>Tabelle</title>
    </head>
    <body onLoad="Erzeuge_Sortierzeile(-1,''); Schreibe_Tabelle(Tabellendaten);">
    <div id="Kopfbereich">
    <h1>Teilnehmer</h1>
    
    <noscript>
    <p>Die Daten auf dieser Seite lassen sich nur mit JavaScript-f&auml;higen Browsern und mit eingeschaltetem JavaScript anzeigen!</p>
    </noscript>
    </div>
    <div id="Tabelle"></div>
    
    </body>
    
    </html>
    Wäre schön, wenn mir jemand sagen könnte, wo der Fehler liegt.
    Vielen Dank und viele Grüße,
    Fabian

    Achja: In Spalte 1 kommen nur verschiedene Einträge vor, die Einträge in Spalte 2 hingegen können auch in mehreren Zeilen identisch sein.
    Zuletzt editiert von fabi03; 06.05.2010, 20:27.

  • #2
    http://aktuell.de.selfhtml.org/artik...len-sortieren/
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      Genau diesen Code habe ich als Vorlage für meinen verwendet.

      Ich habe meinen Code schon mehrmals mit dem der Vorlage überprüft, finde jedoch keine Unterschiede/Fehler..

      Comment


      • #4
        Könnte daran liegen, dass du den Ort nummerisch sortieren lässt
        Christian

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          Könnte daran liegen, dass du den Ort nummerisch sortieren lässt
          Bist du dir sicher?
          Ich dachte, dass
          Code:
          var Spaltensortierungen = new Array(
           "alphabetisch","alphabetisch"
          die Sortierung bestimmt, also 1. Spalte "alphabetisch", 2. Spalte auch "alphabetisch"?

          Comment


          • #6
            sorry beim Textvergleich die falsche Datei erwischt
            Christian

            Comment


            • #7
              Dein Script funktioniert hier einwandfrei????
              Christian

              Comment


              • #8
                Originally posted by Christian Marquardt View Post
                Dein Script funktioniert hier einwandfrei????
                Bei mir funktioniert nur die Sortierung nach Spalte 1, nicht nach Spalte 2

                Hab's mit drei verschiedenen Browsern (Firefox, IE & Chrome) versucht, aber die Sortierung nach Spalte 2 funktioniert nirgends.

                Hast du 'ne Idee, an was das liegen könnte?

                Comment


                • #9
                  Bild3.jpg

                  IE 8, Spalte 2 funktioniert einwandfrei
                  Christian

                  Comment


                  • #10
                    Genau so sieht's bei mir auch aus, aber einwandfrei ist's trozdem nicht

                    Schau dir mal Spalte 1 an..

                    Vor der Sortierung waren die Personen A-G vorhanden, jetzt gibt's z.B. Person E dreifach, Person B ist verschwunden.

                    Comment


                    • #11
                      in Spalte 2 hingegen können auch in mehreren Zeilen identisch sein.
                      Da liegt das Problem. aufgrund der Art der Programmierung ist den folgenden Zeilen

                      for(i = 0; i < Zeilen; ++i)
                      for(var j = 0; j < Zeilen; ++j)
                      if(Spaltendaten[i] == Vergleichsdaten[j])
                      SortierIndex[i] = j;


                      es dann nciht mehr möglich nach der Sortierung die zu dem sortierten Wert gehörenden anderen Spaltendaten zu finden.

                      Grundursache dürfte sein, dass leider zum sortieren die Methoden

                      if(Art == "alphabetisch") Spaltendaten.sort();
                      if(Art == "numerisch") Spaltendaten.sort(Numsort);

                      genutzt werden. Diese sortieren nur das Array der Spalte die eben zu sortieren ist. Danach wird erst versucht - in einem gesonderten Schleifendurchgang - die restlichen Daten wieder der schon sortierten Spalte zuzuordnen. Das schlägt fehl, wenn in der zu sortierenden Spalte identische Daten drin sind. Dort wird einfach der erste Treffer als "gefundene Daten" genommen

                      Das ist murks.

                      Auch ein Ablöschen von Vergleichsdaten[j] nach der Zuordung zum SortierIndex bringt nichts, da hier ja nur stur in der Reihenfolge gesucht wird. Das heisst nicht, dass der erste Treffer in den Vergleichsdaten auch der richtige ist.

                      Hier wäre eine manuelle Sortierung zu implementieren, die innerhalb des Sortieren auch gleich die dazugehörigen anderen Spaltendaten umsortiert
                      Christian

                      Comment


                      • #12
                        Vielen Dank für deine ausführliche Aerklärung

                        Die Ursache des Problems habe ich jetzt zwar verstanden, aber um das Problem zu beheben kenne ich mich zu wenig mit JS aus

                        Wenn's nicht zu viel Arbeit ist, könntest du mir vielleicht den Code entsprechend verändern?

                        Vielen Dank

                        Comment


                        • #13
                          Dazu habe ich nicht so die Lust
                          Christian

                          Comment


                          • #14
                            Originally posted by fabi03 View Post
                            ...Die Ursache des Problems habe ich jetzt zwar verstanden, aber um das Problem zu beheben kenne ich mich zu wenig mit JS aus
                            Dann ist das doch jetzt ein guter Grund, sich mit JS zu beschäftigen
                            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                            Comment


                            • #15
                              Nachdem ich es nicht geschafft habe, eine funktinierende Suchfunktion zu programmieren, habe ich das Problem wie folgt gelöst:

                              Da ja in jeder Zelle etwas anderes stehen muss, habe ich einfach eine fortlaufende Nummerirung eingebaut, welcher aber natürlich nur im Code angezeigt wird.

                              Code:
                              var Tabellendaten = new Array(
                              "Person A", "Ort H <!-- 1 -->",
                              "Person B", "Ort F <!-- 2 -->",
                              "Person C", "Ort F <!-- 3 -->",
                              "Person D", "Ort K <!-- 4 -->",
                              "Person E", "Ort F <!-- 5 -->",
                              "Person F", "Ort J <!-- 6 -->",
                              "Person G", "Ort K <!-- 7 -->"
                              );
                              Vielen Dank nochmal für all eure Hilfe

                              Comment

                              Working...
                              X