enrico: Fehler: ..... has no properties

Guten Abend,

ich komme bei der Beseitigung der folgenden Fehlermeldung einfach nicht weiter:

Fehler: Temp_Temp[i] has no properties

Hier die Funktion und - markiert - die mir ausgegebene, fehlerhafte Zeile:

function Filtern(Temp)
{
   var Kriterium_Anfangsbuchstabe = window.document.getElementById ("Anfangsbuchstabe").value;
   var Kriterium_Genre            = window.document.getElementById ("Genre").value;
   var Kriterium_FSK              = window.document.getElementById ("FSK").value;

var Temp_Temp = new Array();

if (Anfangsbuchstabe != "")
   {
      for (var i = 0; i < Temp.length; i++)
      {
         Anfangsbuchstabe = Temp[i]["Titel"].substring (0,1);

if (Anfangsbuchstabe == Kriterium_Anfangsbuchstabe)
         {
            Temp_Temp[i] = new Object();
            Temp_Temp[i]["Nr"]     = Temp[i]["Nr"];
            Temp_Temp[i]["Titel"]  = Temp[i]["Titel"];
            Temp_Temp[i]["Inhalt"] = Temp[i]["Inhalt"];
            Temp_Temp[i]["Genre"]  = Temp[i]["Genre"];
            Temp_Temp[i]["FSK"]    = Temp[i]["FSK"];
         }
      }

Temp = new Array();

for (var i = 0; i < Temp_Temp.length; i++)
      {
         Temp[i] = new Object();
----->   Temp[i]["Nr"]     = Temp_Temp[i]["Nr"]; <-----
         Temp[i]["Titel"]  = Temp_Temp[i]["Titel"];
         Temp[i]["Inhalt"] = Temp_Temp[i]["Inhalt"];
         Temp[i]["Genre"]  = Temp_Temp[i]["Genre"];
         Temp[i]["FSK"]    = Temp_Temp[i]["FSK"];
      }
   }

.....

}

Ich übergebe der Funktion "Filtern" ein zweidimensionales Array, die Werte der Variablen
Variablen Kriterium_..... stammen aus versteckten Eingabefeldern, die Übergabe und das
Einlesen klappen.

Ich habe das Array "Temp_Temp" eingerichtet und mit "new Object" erweitert.

Warum bekomme ich obige Fehlermeldung ?

Vielen Dank im Voraus.

Viele Grüße
Enrico

  1. Hallo,

    Ich übergebe der Funktion "Filtern" ein zweidimensionales Array, die Werte der Variablen ...

    es ist wohl eher ein eindimensionale Array mit Objekten als Elemente.

    wenn du nun ein Objekt kopierst, warum dann nicht:

      
      neues_object = altes_object.  
    
    

    kennst du das http://de.selfhtml.org/javascript/objekte/array.htm@title=Array-Kapitel?

    auch wenn man solche Abfragen närrisch findet, bleibe ich dabei:

      
    for (var i = 0; i < Temp_Temp.length; i++) {  
      
      if ( ! Temp_Temp[i]) alert( "Temp_Temp[i] existiert nicht - i: "+i);  
      
      Temp[i] = Temp_Temp[i];  
      }  
      
    das beseitigt zwar nicht den Fehler, gibt dir aber evtl. den nötigen Hinweis.  
    
    

    Gruß plan_B

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

      ich habe Deinen Rat beherzigt und folgende Ausgaben eingebaut:

      if (Kriterium_Anfangsbuchstabe != "")
       {
        var Temp_Temp = new Array();

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

      if (Anfangsbuchstabe == Kriterium_Anfangsbuchstabe)
         {
           Temp_Temp[i] = new Object();
           Temp_Temp[i]["Nr"]     = Temp[i]["Nr"];
           Temp_Temp[i]["Titel"]  = Temp[i]["Titel"];
           Temp_Temp[i]["Inhalt"] = Temp[i]["Inhalt"];
           Temp_Temp[i]["Genre"]  = Temp[i]["Genre"];
           Temp_Temp[i]["FSK"]    = Temp[i]["FSK"];
         }
        }

      Temp = new Array();

      for (var i = 0; i < Temp_Temp.length; i++)
        {

      alert ("Länge von 'Temp_Temp': " + Temp_Temp.length);

      <-----+
         if (!Temp_Temp[i])                                    |
         {                                                     |
          alert ("Temp_Temp[i] existiert nicht - i: " + i); |
         }                                                     |
                                                                  <-----+

      Temp[i] = new Object();
          Temp[i]["Nr"]     = Temp_Temp[i]["Nr"];
          Temp[i]["Titel"]  = Temp_Temp[i]["Titel"];
          Temp[i]["Inhalt"] = Temp_Temp[i]["Inhalt"];
          Temp[i]["Genre"]  = Temp_Temp[i]["Genre"];
          Temp[i]["FSK"]    = Temp_Temp[i]["FSK"];
        }
       }

      Ich bekomme als Länge für Temp_Temp den Wert 25 ausgegeben und 0 als Wert
      für das existierende Element von Temp_Temp, was mir sagt, dass das Array
      Temp_Temp doch an und für sich richtig erzeugt worden sein müsste, oder
      liege ich hier falsch?

      Gruß,
      Enrico

      1. Ich bekomme als Länge für Temp_Temp den Wert 25 ausgegeben und 0 als Wert
        für das existierende Element von Temp_Temp, was mir sagt, dass das Array
        Temp_Temp doch an und für sich richtig erzeugt worden sein müsste, oder
        liege ich hier falsch?

        Nein, aber welche Elemente existieren nicht?
        Es sieht eher so aus, als ob deine Programmierlogik falsch ist.
        Ich nehme an, du wilst hier:

         if (Anfangsbuchstabe == Kriterium_Anfangsbuchstabe)  
           {  
             Temp_Temp[i] = new Object();  
             Temp_Temp[i]["Nr"]     = Temp[i]["Nr"];  
             Temp_Temp[i]["Titel"]  = Temp[i]["Titel"];  
             Temp_Temp[i]["Inhalt"] = Temp[i]["Inhalt"];  
             Temp_Temp[i]["Genre"]  = Temp[i]["Genre"];  
             Temp_Temp[i]["FSK"]    = Temp[i]["FSK"];  
           }  
        
        

        Nicht i verwenden, sondern push.

        Temp_Temp.push( {  
        Nr: Temp[i]["Nr"],  
        Titel: Temp[i]["Titel"],  
        ...  
        });  
        
        

        Struppi.

        1. Hi,

          Es sieht eher so aus, als ob deine Programmierlogik falsch ist.
          Ich nehme an, du wilst hier:

          if (Anfangsbuchstabe == Kriterium_Anfangsbuchstabe)

          {
               Temp_Temp[i] = new Object();
               Temp_Temp[i]["Nr"]     = Temp[i]["Nr"];
               Temp_Temp[i]["Titel"]  = Temp[i]["Titel"];
               Temp_Temp[i]["Inhalt"] = Temp[i]["Inhalt"];
               Temp_Temp[i]["Genre"]  = Temp[i]["Genre"];
               Temp_Temp[i]["FSK"]    = Temp[i]["FSK"];
             }

          
          >   
          > Nicht i verwenden, sondern push.  
            
          Lustig - schon wieder das gleiche, wie hier </archiv/2008/4/t169548/>  
            
          MfG ChrisB
          
          1. Nicht i verwenden, sondern push.

            Lustig - schon wieder das gleiche, wie hier </archiv/2008/4/t169548/>

            Ist ja PHP, also was ganz anderes ;-)

            Struppi.

        2. Hallo Struppi,

          Menschenskinder, genau, "push" ist die Lösung... :-))

          Jetzt bekomme ich zumindest keine Fehlermeldung mehr, das ist schon was.

          So, jetzt habe ich nur noch das Problem zu lösen, dass ich die Filterung noch nicht wie gewünscht hinbekomme.

          Ich habe die Möglichkeit vorgesehen, meine Sammlung anhand maximal dreier Kriterien filtern zu lassen:

          -anhand des Anfangsbuchstaben der Titel
          -anhand des Genres
          -anhand der Altersfreigabe

          Von der Logik müsste es wie folgt umgesetzt werden:

          Prüfung 1: Kriterium für Anfangsbuchstaben gesetzt ?

          Ja:
           -Array "Temp" komplett durchlaufen und bei Übereinstimmung in Array "Temp_Temp" überspielen
           -Array "Temp_Temp" in's Array Temp zurückspielen und Länge "Temp" um letztes Element + 1 bis
             zum Ende ( = Länge "Temp_Temp") reduzieren

          Nein: Weiter mit Prüfung 2

          Prüfung 2: Kriterium für Genre gesetzt ?

          Ja:
           -Array "Temp" komplett durchlaufen und bei Übereinstimmung in Array "Temp_Temp" überspielen
           -Array "Temp_Temp" in's Array Temp zurückspielen und Länge "Temp" um letztes Element + 1 bis
             zum Ende ( = Länge "Temp_Temp") reduzieren

          Nein:
           Weiter mit Prüfung 3

          Prüfung 3: Kriterium für Altersfreigabe gesetzt ?

          Ja:
           -Array "Temp" komplett durchlaufen und bei Übereinstimmung in Array "Temp_Temp" überspielen
           -Array "Temp_Temp" in's Array Temp zurückspielen und Länge "Temp" um letztes Element + 1 bis
             zum Ende ( = Länge "Temp_Temp") reduzieren

          Nein: keine Aktion

          Meine Funktion sieht nun wie folgt aus (für alle drei Filtermöglichkeiten):

          function Filtern(Temp)
           {
            var Kriterium_Anfangsbuchstabe = window.document.getElementById ("Anfangsbuchstabe").value;
            var Kriterium_Genre            = window.document.getElementById ("Genre").value;
            var Kriterium_FSK              = window.document.getElementById ("FSK").value;

          if (Kriterium_Anfangsbuchstabe != "")
            {
             var Temp_Temp = new Array();

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

          if (Anfangsbuchstabe == Kriterium_Anfangsbuchstabe)
              {
               Temp_Temp.push({
                Nr:     Temp[i]["Nr"],
                Titel:  Temp[i]["Titel"],
                Inhalt: Temp[i]["Inhalt"],
                Genre:  Temp[i]["Genre"],
                FSK:    Temp[i]["FSK"],
               });
              }
             }

          for (var i = 0; i < Temp_Temp.length; i++)
             {
              Temp.push({
               Nr:     Temp_Temp[i]["Nr"],
               Titel:  Temp_Temp[i]["Titel"],
               Inhalt: Temp_Temp[i]["Inhalt"],
               Genre:  Temp_Temp[i]["Genre"],
               FSK:    Temp_Temp[i]["FSK"],
              });
             }

          Temp.splice (0, Temp_Temp.length);
            }

          if (Kriterium_Genre != "")
            {
             var Temp_Temp = new Array();

          for (var i = 0; i < Temp.length; i++)
             {
              if (Temp[i]["Genre"] == Kriterium_Genre)
              {
               Temp_Temp.push({
                Nr:     Temp[i]["Nr"],
                Titel:  Temp[i]["Titel"],
                Inhalt: Temp[i]["Inhalt"],
                Genre:  Temp[i]["Genre"],
                FSK:    Temp[i]["FSK"],
               });
              }
             }

          for (var i = 0; i < Temp_Temp.length; i++)
             {
              Temp.push({
               Nr:     Temp_Temp[i]["Nr"],
               Titel:  Temp_Temp[i]["Titel"],
               Inhalt: Temp_Temp[i]["Inhalt"],
               Genre:  Temp_Temp[i]["Genre"],
               FSK:    Temp_Temp[i]["FSK"],
              });
             }

          Temp.splice (0, Temp_Temp.length);
            }

          if (Kriterium_FSK != "")
            {
             var Temp_Temp = new Array();

          for (var i = 0; i < Temp.length; i++)
             {
              if (Temp[i]["FSK"] == Kriterium_FSK)
              {
               Temp_Temp.push({
                Nr:     Temp[i]["Nr"],
                Titel:  Temp[i]["Titel"],
                Inhalt: Temp[i]["Inhalt"],
                Genre:  Temp[i]["Genre"],
                FSK:    Temp[i]["FSK"],
               });
              }
             }

          for (var i = 0; i < Temp_Temp.length; i++)
             {
              Temp.push({
               Nr:     Temp_Temp[i]["Nr"],
               Titel:  Temp_Temp[i]["Titel"],
               Inhalt: Temp_Temp[i]["Inhalt"],
               Genre:  Temp_Temp[i]["Genre"],
               FSK:    Temp_Temp[i]["FSK"],
              });
             }

          Temp.splice (0, Temp_Temp.length);
            }

          Liste_ausgeben(Temp);
           }

          Muß ich beim "slice"-Befehl bei der Anwendung auf mein assoziatives Array anders vorgehen?

          Viele Grüße
          Enrico