2 votes

Erreur de Type Non Rattrapée : Cannot read property 'xxxx' of undefined, But it's defined.

J'ai des problèmes avec ce problème depuis des heures. J'ai écrit ceci dans ma fonction Jquery pour vérifier la valeur de la variable si elle existe ou non.

console.log("in tr");
console.log(tmpRoomlistArray[c].room_name);
let roomName = tmpRoomlistArray[c].room_name;

Quand j'ai couru et regardé la console Google Chrome. Il montre des résultats comme celui-ci.

Rome  <<< In console.log It shows valid value                                   
in tr                                                       
Uncaught TypeError: Cannot read property 'room_name' of undefined << 
This is what happen when I assign in to a variable and this is what I need 

Que se passe-t-il ? Je suis aveugle en ce moment

edit : modifier le contenu de la question

1voto

tanawat yakit Points 21

Je l'ai déjà résolu. C'est juste un problème stupide que j'ai négligé. C'est à propos de l'index du tableau.

Je viens de mettre

tmpRoomlistArray[c-1]

dans ma fonction et ça a marché. Je pense que la solution est juste de se reposer davantage, pour que tu puisses voir le problème plus clairement.

Pour ceux qui veulent savoir ce qui s'est passé, lisez ce qui suit.

J'ai une fonction qui insère une ligne dans le tableau, et cette fonction a 2 paramètres, qui est un tableau. Donc cette fonction va insérer des lignes de façon continue dans le tableau. Elle ne s'arrêtera pas avant d'avoir atteint la fin du tableau.

var day = ["1","2","3"];
var room = ["room1","room2","room3",....,"room16"] // 16 Elements;
var timeForHeader = ["08:00","09:00",....."20:00"] // 25 Elements; 

function addRow(paramDay,paramRoom){ 
 // this function will create many rows depends on paramRoom length and columns depends on length of time header.
   var dayLength = day.length;
   var roomLength = room.length;
   var timeForHeaderLength = timeForHeader.length;
   for(var i = 0; i < dayLength; i++)
   {
      // this is for rows
       for(var c = 0; c < timeForHeaderLength+1; c++)
       {
          // I made c +1 timeForHeaderLength because I want a header 
          //this is for column
          if(c == 0)
          { 
            // if c == 0 mean I will insert a header row element in my table
             var tr = $("<tr/>");
             var td = $("<td/>",{text:timeForHeader[0]+" - "+timeForHeader[1]}).appendTo(tr);
             ...
             ...
             var td23 = $("<td/>",{text:timeForHeader[23]+" - "+timeForHeader[24]}).appendTo(tr);
             $("#mytableId").append(tr);
          }else{
            // this row that contain room's name and content
            // and this is the part that cause me a problem.
            // in this else condition c must be 1-17 so when I access to tmpRoomlistArray that contains 16 Element
            // So right now You guys should know right. The tmpRoomlistArray's index must be 0 - 16

            // it worked when c is between 1 - 16, But it didn't work on the last c cause c is equal to 17
             console.log(tmpRoomlistArray[c].room_name);
            let roomName = tmpRoomlistArray[c].room_name;
            //It should be 
            let roomName = tmpRoomlistArray[c-1].room_name;
            // Hahahahahahahahahahahahahahahahahhaha
          }              
       }

   }
}

0voto

tmpRoomlistArray[c] est considéré comme indéfini.

Essayez d'imprimer :

  console.log(tmpRoomlistArray[c]);

ou

 console.log(tmpRoomlistArray);

au lieu de

console.log(tmpRoomlistArray[c].room_name);

Vous pouvez également utiliser

  debugger 

dans le code javascript pour surveiller la valeur du tableau.

0voto

Dave Points 364

Utiliser var au lieu de let ?

Pourrait-on chercher quelque chose de plus fortement typé ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X