Thomas Binder: dynamisches Sortieren einer Tabelle

Hallo zusammen,

der sehr gute Feature-Artikel über dynamisches Sortieren einer Tabelle per Javascript unter http://aktuell.de.selfhtml.org/artikel/dhtml/tabellen-sortieren/
enthält in seinem Beispiel-Coding noch einen Bug. Wie man sich leicht selbst überzeugen kann, führt dieser Bug zu einer fehlerhaften Ausgabe, wenn der zu sortierende Datenbestand in der relevanten Spalte (also dem Sortierkriterium) Sätze mit gleichem Wert enthält.

Ich habe eine Lösung dieses Problems gefunden, die auch zu funktionieren scheint.
Sie ist aber daran gebunden, dass die Funktion "numsort" aus diesem Coding stabil sortiert, d.h. bei Sätzen mit gleichem Wert im Sortierkriterium deren ursprüngliche Reihenfolge beibehält. Zum Glück, geht es bei mir nur um numerische Werte, so dass ich mich auf den Numsort beschränken kann. Die eigentliche Methode "sort" von JavaScript sortiert ja wohl nicht stabil.

Kann mal jemand, der mehr von der Materie versteht, checken, ob diese Funktion "numsort" stabil sortiert ?
Ist das evtl. Browser-abhängig ?
Gibt es eine Möglichkeit, den eigentlichen "sort" stabil zu machen ?

Vielen Dank im Voraus
Thomas Binder, Berlin

  1. hi,

    auf der Suche nach einer Möglichkeit über Javascript Tabellen zu sortieren bin ich auch als erstes über das Script von Stefan gestolpert...jedoch war dies bei grossen Tabellen (wie hier beschrieben) viel zu langsam.

    Ein meines Erachtens wirklich sehr guter Ansatz ist im gleichen Artikel von Jürgen verlinkt worden (hier zu finden).

    Seine Sortierung benutze ich für extrem grosse Tabellen (über 200 Sätze mit 20 oder 30 Spalten): 1. performant und 2. auch ohne die von dir geschilderten Probleme.

    Ich hatte nur noch ein Problem: wenn ein Inhalt (eine "Zelle") leer ist, sortiert er dies nicht richtig - hierfür kann man sich aber leicht behelfen, indem man einen Dummy-Wert (num z.B. "0.00000000001" und char z.B. "_Z") einfügt und vorm Zurückschreiben wieder rausnimmt.

    Danke nochmal an JürgenB! Und Thomas - vielleicht guckst du dir hier etwas für dein Problem ab...

    Gruss,
    Seppel

    1. hi,

      auf der Suche nach einer Möglichkeit über Javascript Tabellen zu sortieren bin ich auch als erstes über das Script von Stefan gestolpert...jedoch war dies bei grossen Tabellen (wie hier beschrieben) viel zu langsam.

      Vielen Dank für die Hinweise,
      ich werde mal schauen, ob ich mich mit dem anderen Skript anfreunden kann. An sich gefällt mir Stefans Lösung sehr gut, nachdem ich den Bug bei gleichen Werten ja beseitigen konnte. Bleibt nur die Frage, ob "numsort" stabil sortiert - ich glaube inzwischen, es tut...

      Auch mit der Performance habe ich keine Probleme - es sortiert in "Null-komma-Nix". Meine Tabelle enthält z.Zt. 66 Zeilen (absehbar vielleicht mal 150) zu je 7 Spalten, davon 6 numerisch.
      Wovon dürfte denn die Sortiergeschwindigkeit bei Stefans Skript abhängig sein (Anzahl der Spalten, Anzahl der Zeilen, Inhalte)?

      Beste Grüße
      Thomas Binder, Berlin

    2. hi,

      auf der Suche nach einer Möglichkeit über Javascript Tabellen zu sortieren bin ich auch als erstes über das Script von Stefan gestolpert...jedoch war dies bei grossen Tabellen (wie hier beschrieben) viel zu langsam.

      Also ich habe meine Lösung (basierend auf jener aus dem Feature-Artikel von Stefan Münz) jetzt online unter
      http://www.herderschach.de/Fame/team_einsaetze_sort.html.
      Ich finde, mit dem jetzigen Datenbestand performt es doch recht gut. Datenwachstum ist im Laufe der Zeit für die Zeilen zu erwarten, weitere Spalten kommen nicht hinzu.

      Das Problem der instabilen Sortierung hat sich als nicht so relevant erwiesen, wie ich befürchtet hatte.

      Vielen Dank für die Antworten
      Thomas

  2. Hallo

    der sehr gute Feature-Artikel über dynamisches Sortieren einer Tabelle per Javascript unter http://aktuell.de.selfhtml.org/artikel/dhtml/tabellen-sortieren/

    Ich finde diesen Ansatz gar nicht gut, denn er schliesst Browser ohne JavaScript einfach aus. Siehe dazu http://aktuell.de.selfhtml.org/weblog/javascript-einsatz. Eine bessere Lösung wäre ein Script, dass die Daten aus einer bestehenden HTML-Tabelle ausliest und dieser dann die Sortierfunktion anfügt.
    Ich hatte mal ein solches Skript mit der Vorlage eines Artikels aus der iX erstellt: http://www.khausali.ch/js/sTable.js

    Ich habe eine Lösung dieses Problems gefunden, die auch zu funktionieren scheint.

    Wie sieht die denn aus?

    Sie ist aber daran gebunden, dass die Funktion "numsort" aus diesem Coding stabil sortiert, d.h. bei Sätzen mit gleichem Wert im Sortierkriterium deren ursprüngliche Reihenfolge beibehält. Zum Glück, geht es bei mir nur um numerische Werte, so dass ich mich auf den Numsort beschränken kann. Die eigentliche Methode "sort" von JavaScript sortiert ja wohl nicht stabil.

    Kann mal jemand, der mehr von der Materie versteht, checken, ob diese Funktion "numsort" stabil sortiert ?
    Ist das evtl. Browser-abhängig ?

    Dafür habe ich folgenden Testcode geschrieben:

      
    window.onload= function() {  
     var a=new Array('2','11c','4','7a','6','13','11d','7b');  
     alert(a.sort(numSort));  
    };  
      
    function numSort(a,b) {  
     return (parseInt(a)-parseInt(b));  
    }  
    
    

    Die Browser reagieren ganz verschieden.
    Stabil:
    IE(6 und 7): 2,4,6,7a,7b,11c,11d,13
    Safari: 2,4,6,7a,7b,11c,11d,13
    Instabil instabil:
    Firefox: 2,4,6,7b,7a,11c,11d,13
    Stabil instabil:
    Opera: 2,4,6,7b,7a,11d,11c,13

    Gibt es eine Möglichkeit, den eigentlichen "sort" stabil zu machen?

    Interessante Frage! Vielleicht indem man die Array.prototype.sort() überschreibt, was aber zu lasten der Performance ginge...

    Gruss,
    Mathias

    1. Hallo

      Ich finde diesen Ansatz gar nicht gut, denn er schliesst Browser ohne JavaScript einfach aus.

      »»
      Ja, das ist mir schon klar. Wer kein JavaScript kann oder will, verzichtet zwar auf die sortierbare Tabelle, bekommt die gleichen Informationen aber auf einer alternativen Seite angezeigt. Das hatte ich also von vornherein berücksichtigt.

      Ich habe eine Lösung dieses Problems gefunden, die auch zu funktionieren scheint.

      Wie sieht die denn aus?

      Da sie eben an die Stabilität des numsort gebunden ist (und diese wohl leider nicht besteht), hat es zunächst keinen Sinn, diese Lösung hier zu posten. Ich habe mich per Email an Stefan gewandt, auf den Bug in seinem Coding hingewiesen und bin zuversichtlich, dass er eine tragfähige Verbesserung liefern wird.

      Beste Grüße
      Thomas Binder

    2. Ich habe eine Lösung dieses Problems gefunden, die auch zu funktionieren scheint.

      Wie sieht die denn aus?

      Nachdem sich die Instabilität des numsort doch nicht als problematisch erwiesen hat, konnte ich es bei meiner Lösung belassen.
      In dem Skript aus Stefan Münz's Feature-Artikel sind nur wenige Ergänzungen erforderlich:

      1. Ein zusätzliches Array "Kontrolldaten". Dieses wird parallel zu den beiden anderen Sortier-Arrays mit Nullen aufgefüllt.
         var Kontrolldaten = new Array();  NEU
         var SortierIndex = new Array();
         for(var i = 0; i < Zeilen; ++i)
          { Spaltendaten[i] = Vergleichsdaten[i] = Tabellendaten[i * Spalten + Nummer];
          Kontrolldaten[i] = 0; } NEU
        (Nur die NEU-Zeilen und die Klammerung kamen hinzu.)

      Dieses Array dient zur Kennzeichnung der bereis "abgearbeiteten" Vergleichsdaten und wird daher beim Abarbeiten mit Einsen ersetzt.
      Hinzu kommt eine entsprechende Erweiterung der Abfrage im Sortierteil, also:
      2)
      if(Spaltendaten[i] == Vergleichsdaten[j] && Kontrolldaten[j] == 0)
        { SortierIndex[i] = j; Kontrolldaten[j] = 1; break; }
      Neu ist hier (erneut neben der Klammerung) folgendes:

      • Die Ergänzung der if-Bedingung um die Kontrolldaten
      • Das Setzen der "verbrauchten" Indizes auf "1" im Kontrolldaten-Array
      • Das Break um mehrfaches Abarbeiten der Schleife bei gleichen Werten zu verhindern.

      Bin für kritische Prüfung jederzeit dankbar, aber es scheint in allen gängigen Browsern (okay - mit JavaScript) zu funktionieren.
      Hier die entsprechende Seite:
      http://www.herderschach.de/Fame/team_einsaetze_sort.html