2010-03-09 2 views
3

이 코드가 정의되지 않습니다.는 반복에 대해, 요소

아무도 이것이 어떻게 가능할까요?

+0

모든 답변 주셔서 감사합니다. if 문에 'this.units [i] &&'를 덧붙이고 null을 찾으러 내려 간다고 생각합니다. – naugtur

답변

1

뾰족한 부분은 그의 대답에서 문제의 가능한 원인을 간략히 언급했으며 this.units[i]은 null 일 수 있습니다. null 값에서 속성에 액세스하려고하면 "null이거나 객체가 아닙니다"오류가 발생합니다. 귀하의 예에서 이것은 if 문에서 this.units[i].x에 액세스하려는 시도에 의해 발생합니다.

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 
} 

당신은 또한 가장 중요한 for...in 루프 배열에 적합하지 않은 것을, 그의 대답의 다른 점을 확인해야 할 가장 안전한 것은 확인하고 null 값이 처음입니다 있는지 확인하는 것입니다.

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

당신은 this.units에서 요소를 사용하여 인덱스 this.units에 노력하고 있습니다. 대신 for 루프를 사용하십시오 (위 그림 참조).

for (var i in this.units) 

+2

하지만 어레이가 아닌 경우에는 어떻게해야합니까? "{hello : world}"와 같은 객체 인 경우 솔루션이 작동하지 않습니다. – Pointy

+0

@Pointy는 요점이 있지만, OP가이 가정에 어떻게 이끌 수 있었는지 확인할 수 있습니다. 'var i'의 사용은 일반적으로 증가하는 정수를 나타냅니다. 그러나 아버지는 항상 나를 생각하지 말라고 하셨다. (왜냐하면 * u *와 * me *). :-) –

+0

사실. 이것은 객체이므로 정수로 반복 할 수 없습니다. "i"는 제 경우의 문자열입니다. – naugtur

2

루프 표기법은 당신에게 "단위"개체에 정의 된 속성을 제공합니다. 어딘가에 무엇인가가 완료 한 경우 그 중 일부는 예를 들어, 값이 없을 수 있습니다 : 당신이 정말이 객체에 무슨 일이 일어나고 있는지 알지 못한다면

this.units.balloon = null; 

루프 "의"와 개체 속성을 통해 반복하는 것은 매우 위험합니다. 객체가 실제로 배열 인 경우에는 확실히하지 않으려합니다. 숫자 인덱스와 숫자 변수가있는 일반 루프를 사용해야합니다. (그럼에도 불구하고 null 항목이있을 수 있습니다!)

1

MY 불량 :이 질문이 파이썬에 있다고 생각했습니다! 코드에서 어딘가에

del this.units[i] 

또는 어떤 방법으로 컬렉션을 변경 :

당신은 아마 뭔가를하고 있습니다. 반복 중에는 No-No입니다.

+0

델 (Del)이 아니라 삭제 된 것입니다. 그러나 나는 당신이 옳을 수도 있다고 생각합니다. 여전히 나는 현재 요소 만 삭제하면 문제를 일으키는 이유는 모르겠다. – naugtur

+0

@naugtur :'delete ... '루프가 문제가된다고 의심 스럽습니다.'for ... in' 루프 전에 속성을'삭제'하면 속성이 사라지고 반복되지 않습니다. for 문 다음과 if 문 앞에는 코드의 해당 부분에 오류가 발생하도록 삭제해야합니다. –

+0

당신은 오해했습니다. 때로는 루프 내부의 코드 부분에서 if 문 다음에 현재 요소 인 this.units [i]를 삭제합니다. 루프 동작에서 무엇이 변경되는지 궁금합니다. – naugtur

1

우선, 반복이 객체 위에있는 경우 "i"를 반복 변수로 사용하지 말고 prop 또는 key를 사용하여 색인이 아닌 반복 속성임을 분명히하십시오.

두 번째로 간단히 디버그하여 개체의 어떤 요소가 비어 있는지 확인할 수 있습니다. 전체 코드가 없으면 당신을 도울 수 없습니다. 문제가 당신이 수행하여 삭제라고 생각합니다

obj.myProp = null; 

즉, for 루프는 해당 속성을 계속 반복한다는 의미입니다. 그러나 사용하는 경우

delete obj.myProp; 

myProp은 for 루프에서 반복되지 않습니다.

+0

나는'delete obj.myProp;'를 의미한다고 생각한다. 'del'은 JavaScript에서 키워드가 아닙니다. –

+0

삭제를 사용합니다. – naugtur

+0

@naugtur가 더 많은 컨텍스트를 게시 하시겠습니까? –