2012-07-30 2 views
1

특정 'ID'가있는 '구성원'개체가 컨테이너 'EntityGroup'개체의 '구성원'배열에 이미 있는지 확인하려고합니다. 왜 안 다음 EntityGroup.idExists (ID) 작업을 수행합니다개체 배열에 속성 값이 있는지 검색

EntityGroup = function() { 
    this.members = []; // intention is for this to hold 'Entity' objects 
    this.classType = null; // what class of entities does it hold 
}; 
EntityGroup.prototype = { 
    addEntity: function(entityType, EntityID) { 

     // TODO implement .idExists() check here 
     // dont add new member if the id does exist 
     this.members.push(new Entity(entityType, EntityID)) 

    }, 

    idExists: function(EntityID) { 

     var idExists = false, 
      member, 
      members = this.members; 

     for (member in members) { 

      if (EntityID == member.EntityID) { 
       idExists = true; 
       break; 
      } else { 
       continue; 
      } 
     } 
     return idExists; 
    } 
}; 

Entity = function(entityType, EntityID) { 
    this.EntityID = EntityID; 
    this.entityType = entityType; 
}; 

g = new EntityGroup(); 
g.addEntity("Person", 1); 
g.addEntity("Person", 2); 

console.log(g.idExists(1)); // returns false which is not expected 
console.log(g.members); 

답변

3

for (x in y) 배열에서 객체를 반복 할 수있는 권리 구조가 아닙니다. 이는 객체의 키를 통해서만 반복 수행하는 데 사용됩니다.

그래서 무슨 일이 일어나고 있는지 대신 두 Entity 객체를 얻는는 member 변수가 각각 12입니다 해당 개체의 인덱스를 참조된다는 점이다. 이러한 개체를 반복하는 올바른 방법은 다음과 같습니다

for(var i = 0; i < members.length; i++) { 
    EntityID == members[i].EntityID; 
} 
+0

:-) – johowie

3

문제는 당신 for...in 루프입니다. 배열의 항목을 통하지 않고 객체의 속성을 반복 할 때는 for...in 만 사용해야합니다. 다음이 루프를 교체하는 경우

, 당신은 괜찮을 것 :

for(var i=0,len=members.length; i<len; ++i){ 
    var member = members[i]; 
    //the rest 
+0

감사합니다 작동 감사합니다는, 그 :-) 작동 – johowie

관련 문제