Enrico: Probleme mit Erzeugung einer Navigationsleiste aus einem Array

Ich habe in meine webbasierte DVD-Verwaltung eine Navigationsleiste integriert,
mit der ich meine Filmdatenbank (js-Datei) filtern kann:

Klick auf "#" -> Anzeige aller Filme, die mit einer Ziffer beginnen
Klick auf "A" -> Anzeige aller Filme, die mit dem Anfangsbuchstaben "A" beginnen
...usw...

Nun möchte ich die Erstellung dieser Navigationsleiste dynamisch gestalten, so dass
in der Leiste nur die Ziffern/Anfangsbuchstaben auftauchen, die auch wirklich in der
Datenbank existieren.

Dazu habe ich mir folgende Funktion gebastelt:

function Filterfunktion_aufbauen(Film)
   {
     var Anfangsbuchstabe;
     var Liste_Anfangsbuchstaben = new Array();
     var Zeichen;
     var Suche = /^\d/g;

for (var i=0; i<Film.length; i++)
     {
       Anfangsbuchstabe = Film[i][1].substring(0,1);

if (Suche.test(Anfangsbuchstabe))
       {
         Anfangsbuchstabe = "#";
       }

for (var j=0; j<Liste_Anfangsbuchstaben.length; j++)
       {
         if (Liste_Anfangsbuchstaben[j] == Anfangsbuchstabe)
         {
           j=j+1;
         }
         else
           {
             Liste_Anfangsbuchstaben.push(Anfangsbuchstabe);
           }
       }
     }
   }

Ich übergebe als Parameter das Array "Film", das folgende Struktur besitzt:

Film[0]=["DVD-Nr.", "Titel", "Inhalt", "Genre", "FSK"];
   Film[1]=["DVD-Nr.", "Titel", "Inhalt", "Genre", "FSK"];
   ...usw...

Ich durchlaufe eine Schleife "i" von 0 bis zur Anzahl der im Array "Film"
enthaltenen Datensätze (= Zeilen) und schneide jeweils das erste Zeichen des
Titels ab. Ist das Zeichen eine Ziffer (Test über einen regulären Ausdruck),
so soll das Zeichen durch eine Raute ersetzt werden, ansonsten läuft die
Funktion weiter.

Nun durchlaufe ich eine weitere Schleife von 0 bis zur Anzahl der im Array
"Liste_Anfangsbuchstaben" bereits enthaltenen Zeichen, in der ich prüfe, ob
das aktuelle Zeichen bereits im Array enthalten ist (-> weiter mit nächstem
Zeichen) oder nicht (-> dem Array hinzufügen).

Leider muss ich feststellen, dass das Array "Liste_Anfangsbuchstaben" nach
komplettem Durchlaufen der Funktion leer ist und keine Werte enthält, ich
habe das über den "alert"-Befehl ausprobiert.

Ich habe das Array "Film" korrekt definiert, da ich - an anderer Stelle -
die enthaltenen Daten in Tabellenform ausgebe und das funktioniert einwandfrei.

Wo habe ich einen/mehrere Fehler gemacht ?

Vielen Dank für Eure Hilfe.

Gruß,
Enrico

  1. Hallo,

    irgendwie habe ich das Gefühl, du tust dich immer noch schwer mit Arrays. Dabei ist das Kapitel doch gut beschrieben: http://de.selfhtml.org/javascript/objekte/array.htm@title=javascript/objekte/array.htm

    wenn deine Funktion funktionieren würde, nützt es dir doch nichts, wenn du z.B. in deiner Liste_Anfangsbuchstaben["B"] nur B's findest, du möchtest doch dort eine Filmliste finden, quasi eine Teilmenge von Film?

    Liste_Anfangsbuchstaben[] ist jetzt ein Assoziative Arrays (bitte nachlesen)

    dessen Elemente wieder Arrays sind (aber normale mit Index 0...n)

    denke dieses Beispiel müsste einigermassen fehlerfrei sein ....

      
    function Filterfunktion_aufbauen(Film);  
     {  
     var Anfangsbuchstabe;  
     var Liste_Anfangsbuchstaben = new Array();  
     for (var i=0,ie=Film.length; i<ie ; i++) {  
      var c = Film[i][1].charAt(0).toUpperCase();  
      if (c<"A" || c>"Z") c="#";  
      if (!Liste_Anfangsbuchstaben[c]) Liste_Anfangsbuchstaben[c]=new Array();  
      Liste_Anfangsbuchstaben[c].push(Film[i]);  
      }  
     return Liste_Anfangsbuchstaben;  
    }  
      
    var Liste_Anfangsbuchstaben=Filterfunktion_aufbauen(Film);  
      
    var s="Übersicht: Anzahl der Filme\n";  
    for (var c in Liste_Anfangsbuchstaben) {  
     s+="\n"+c+": "+Liste_Anfangsbuchstaben[c].length+" Filme";  
     }  
    alert(s);  
      
      
    var c="B";  
    s="Alle Filme mit "+c+"\n";  
    for (var i=0;i < Liste_Anfangsbuchstaben[c].length; i++ ) {  
     var einFilm=Liste_Anfangsbuchstaben[c][i];  
     s+="\n"+einFilm[1]; // Titel  
     }  
    alert(s);  
      
    
    

    Gruß plan_B

    --
         *®*´¯`·.¸¸.·
    1. Hallo plan_B,

      ich glaube, Du hast mich falsch verstanden oder ich habe mich falsch oder missverständlich ausgedrückt.

      Mir geht es nicht darum, eine Filmliste aufzubauen, sondern eine Art Indexleiste, über die ich die
      Filme filtern kann.

      Die Leiste soll - schematisch - so aussehen:

      +---+---+---+---+---+---+--
      | # | D | F | G | J | L | ...usw...
      +---+---+---+---+---+---+--

      Die Ausgabe aller Filme inkl. Filterung klappt einwandfrei, das ist nicht das Problem.

      Hier das ausformulierte Verhalten der Funktion "Filterfunktion_aufbauen(Film)"

      Das Array "Film" wurde über <script type="text/javascript" src="../JAVASCRIPT/DATENBANK.js"></script>
      in den Kopf meiner html-Datei eingebunden und steht damit sofort zur Verfügung.

      var Film = new Array();
         Film[0]=["1", "DIE SIEGER", ...];
         Film[1]=["2", "DOMINO", ...];
         Film[2]=["3", "GONE", ...];
         Film[3]=["4", "DANCE!", ...];
         Film[4]=["5", "MONEY TRAIN", ...];

      Nun soll die Funktion von jedem erfassten Titel...

      for (var i=0; i<(Film.length-250); i++)
         {

      }

      ...jeweils den Anfangsbuchstaben erfassen...
         Anfangsbuchstabe = Film[i][1].substring(0,1);

      ...und testen, ob es sich hierbei um eine Ziffer handelt und, sofern dies der Fall ist, den Inhalt der
      Variable "Anfangsbuchstabe" durch die Raute ersetzen:

      if (Suche.test(Anfangsbuchstabe))
         {
           Anfangsbuchstabe = "#";
         }

      Nun durchlaufe ich das Array "Liste_Anfangsbuchstaben"...

      for (var j=0; j<Liste_Anfangsbuchstaben.length; j++)
         {
           if (!Liste_Anfangsbuchstaben[j] == Anfangsbuchstabe)
           {
             Liste_Anfangsbuchstaben.push(Anfangsbuchstabe);
           }
         }

      ...und prüfe, ob das aktuelle Zeichen bereits im Array vorkommt. Wenn ja, dann wird die Schleife verlassen,
      ansonsten wird das aktuelle Zeichen dem Array "Liste_Anfangsbuchstaben" hinzugefügt.

      Aber das erwünschte Resultat tritt nicht ein, das Array bleibt leer.

      Gruß,
      Enrico

      1. Hallo,

        gut dein Array Liste_Anfangsbuchstaben[] ist ein normales Array, das du mit Indices 0...n ansprechen kannst.

        jetzt solltest du dir einen Bleistift nehmen und deine Routine mal ein paar Zyklen durchlaufen.

        angenommen deine Filmliste:

        i=0:  "DIE SIEGER", ...];
        Anfangsbuchstabe="D";
        Liste_Anfangsbuchstaben.length: 0
        j=0 , j<0 ? _NEIN_

        Nun durchlaufe ich das Array "Liste_Anfangsbuchstaben"...

        for (var j=0; j<Liste_Anfangsbuchstaben.length; j++)
           {
             if (!Liste_Anfangsbuchstaben[j] == Anfangsbuchstabe)
             {
               Liste_Anfangsbuchstaben.push(Anfangsbuchstabe);
             }
           }

        was passiert? nix, hast du ja beschrieben.
        deine Liste wird gar nicht erst durchlaufen.

        Gruß plan_B

        --
             *®*´¯`·.¸¸.·
        1. Tatsache, wenn die Länge 0 ist und dies gleichzeitig die Abbruchbedingung,
          dann kann ja nie etwas hinzugefügt werden.

          Werde gleich mal daran feilen...

          Gruß,
          Enrico

          1. Hallo,

            ich habe versucht, mein Vorhaben nun über einen String, anstelle eines
            Arrays umzusetzen:

            function Filterfunktion_aufbauen(Film)
            {
              var Anfangsbuchstabe;
              var Liste_Anfangsbuchstaben;
              var Suche = /^\d/g;

            for (var i=0; i<Film.length; i++)
              {
                Anfangsbuchstabe = Film[i][1].substring(0,1);

            if (Suche.test(Anfangsbuchstabe))
                {
                  Anfangsbuchstabe = "#";
                }

            if (Liste_Anfangsbuchstaben.length == 0)
                {
                  Liste_Anfangsbuchstaben = Liste_Anfangsbuchstaben + Anfangsbuchstabe;
                }
                else
                  {
                    for (j=0; j<Liste_Anfangsbuchstaben.length; j++)
                    {
                      if (Anfangsbuchstabe != Liste_Anfangsbuchstaben.charAt(j))
                      {
                        Liste_Anfangsbuchstaben = Liste_Anfangsbuchstaben + Anfangsbuchstabe;
                      }
                    }
                  }
              }
              alert(Liste_Anfangsbuchstaben);
            }

            Nun bekomme ich aber die Fehlermeldung "Liste_Anfangsbuchstaben has no properties".

            Was habe ich hier verkehrt gemacht ?

            Gruß,
            Enrico