Question

J'ai ce code:

for(var i in this.units)
 {
 if(this.units[i].x==att.x && this.units[i].y==att.y){}
 //... some more code
 }

et parfois, au hasard, je reçois un this.units d'erreur [i] est non défini.

Quelqu'un a une idée de comment cela est possible?

Était-ce utile?

La solution

Pointy brièvement abordé la cause probable de la question dans sa réponse et que this.units[i] pourrait être nulle. Si vous essayez d'accéder à une propriété sur une valeur nulle, vous obtiendrez un « est nul ou non un objet » erreur. Dans votre exemple, cela est jeté par la tentative d'accès this.units[i].x dans l'instruction if. La chose la plus sûre à faire est de vérifier et voir si elle est une valeur nulle première:

for(var i in this.units) 
{ 
    if (this.units[i] === null)
        continue;

    if(this.units[i].x==att.x && this.units[i].y==att.y){} 
    //... some more code 
}

Vous devriez également vérifier les autres points de sa réponse, le plus important que les boucles de for...in ne sont pas idéales pour les tableaux.

Autres conseils

La notation de boucle

for (var i in this.units)

vous donne les attributs qui sont définis dans l'objet « unités ». Certains de ceux qui ne peuvent pas avoir une valeur, par exemple, si quelque part quelque chose avait fait:

this.units.balloon = null;

Itère propriétés de l'objet avec « dans » boucles est assez risqué, à moins que vous vraiment savoir ce qui se passe avec vos objets. Si votre objet est en fait un tableau, alors vous ne voulez certainement pas de le faire - vous devez utiliser les index numériques et une boucle simple avec une variable numérique. (Même alors, il pourrait y avoir des entrées nulles!)

MY Bad: Je pensais que cette question était en python

Vous faites probablement quelque chose comme:

del this.units[i]

quelque part dans votre code ou modifier votre collection en quelque sorte. Ceci est un non-non lors de l'itération.

Tout d'abord, si votre itération est sur un objet, ne pas utiliser « i » comme la variable d'itération, prop utilisation ou clé à préciser que vous êtes propriétés itérer, pas d'index.

En second lieu, il semble que vous pouvez simplement debug et savoir quel élément de votre objet est vide. Sans le code complet, il est difficile de vous aider. Je pense que le problème est que vous supprimez en faisant

obj.myProp = null;

Ce qui signifie que dans la boucle itérera encore sur cette propriété. Toutefois, si vous utilisez

delete obj.myProp;

myProp ne sera pas dans une itérer dans la boucle.

for(var i = 0; i < this.units.length; i++){
    if(this.units[i].x==att.x && this.units[i].y==att.y){}
}

Vous essayez de this.units d'index à l'aide d'un élément de this.units. Utiliser une boucle (ci-dessus) à la place.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top