2014-09-08 1 views
0

여기에 다른 활동의 값을 세는 switch 문을 가지고있는 주 등 여러 번 여러 번 일하는 것과 같은 일일 활동을 사람마다 계산하는 프로그램이 있습니다. 나는이 물체가 sort() 함수 안에서 dayEvents object을 나타낼 것을 강요했다. 그러나 forEach method 안에는 전역 물체를 나타내는 그것도있다. 또한 축구가 정의되지 않았다는 오류가있다. 왜 그런가? 나는 어떻게 강제 할 수 있는가? 동일한 dayEvents 개체를 나타내는?여기에 원하는 개체를 나타 내기 위해 forEach 문 안에 숫자를 입력하십시오.

<html> 
<body> 
<script> 
(function(){ 
var dayEvents={ 
    football:0, 
    school:0, 
    video_games:0, 
    watch_tv:0, 
    coding:0, 
    container:[], 
    insert:function(evt){ 
     this.container.push(evt); 

    }, 
    get:function(){ 
     sort.call(this); 
    } 
} 
function sort(){ 

    for(i=0;i<this.container.length;i++){ 


     this.container[i].forEach(function(elements,index,array){ 

       switch(elements){ 
        case football: 
         (this.football)++; 
         break; 
        case school: 
         (this.school)++; 
         break; 
        case video_games: 
         (this.video_games)++; 
         break; 
        case watch_tv: 
         (this.watch_tv)++; 
         break; 
        case coding: 
         (this.coding)++; 
         break;      

       } 

      }); 


    } 

} 
dayEvents.insert(['football','school','video_games','watch_tv','coding']); 
dayEvents.insert(['football','school','coding']); 
dayEvents.insert(['school','video_games','watch_tv','coding']); 
dayEvents.insert(['football','video_games','coding']); 
dayEvents.insert(['school','watch_tv','coding']); 
dayEvents.insert(['football','school','video_games','watch_tv','coding']); 
dayEvents.insert(['football','school','video_games','coding']); 
dayEvents.get(); 
console.log(dayEvents.football); 
})(); 
</script> 
</body> 
</html> 
+2

스위치 케이스는 스트링으로되어 있어야합니다. 케이스. "풋볼".. 케이스 "학교"등. – George

+1

@ 조지 : 예, 아마도. '축구', '학교'등의 변수가있는 경우 기술적으로 유효합니다. (자바 스크립트의 '스위치'는 자바 나 C와는 다르다. 케이스의 값은 표현식이 될 수있다.)하지만 아마 맞는 것 같아. :-) –

+0

물론 OP가 어디로 향하고 있는지는 분명하다. 특별한 경우;) – George

답변

1

공급 thisArg이라고 forEach 두 번째 인자; iterator 콜백 중에 this으로 사용할 것입니다.

this.container[i].forEach(function(elements,index,array){ 
    /* ...contents omitted for brevity... */ 
    }, this); 
// ^^^^^^ 

다른 방법으로, 당신은 Function#bind를 통해 바인딩 기능을 사용할 수 있지만 forEach로 특별히 당신에게 thisArg을 제공합니다

는 그래서, 당신이 외부로 반복자에 this 같은 내부 통화를 가진 찾고있는 생각 , 아마 갈 길입니다. (다른 ES5 배열 추가 모든   — some, every, reduce ... 참고로,뿐만 아니라 그것을 가지고)


별도로, 조지는 질문에 단 댓글에서 지적 하듯,의 값을 사용자의 case 라벨은 약간 의심 :

당신이 football라는 이름의 변수가있는 경우 (이 사람들을 놀라게 할 수 있습니다!)하지만 코드를보고 난 아마 w 당신을 의심, 자바 스크립트에서 유효있어
case football: 

이전 :

case "football": 

... 그리고 다른 것들도 마찬가지입니다.

+0

축구 & "축구"의 차이점은 무엇입니까 ?? –

+1

@ user3138436 :이 문맥에서'football'는 변수 참조입니다. 그 이름의 변수가 없다면, 당신이 그것을 사용하려고 할 때'ReferenceError'를 얻을 것입니다. ''football ''은 문자열입니다. –

+0

감사합니다 !! 만약 당신이 날 실례하면 또 다른 질문이 있습니다. 내가 sortFall (this)을 사용하여 sort() 함수 안에 dayEvents 객체가되도록 설정했다면, 왜 우리는 forEach에 대해 이것을 다시 설정할 필요가 있을까요 ?? –

1

forEach 루프에서 원하는 개체를 얻으려면 해당 개체를 forEach 함수의 두 번째 매개 변수로 전달해야합니다. 스위치 케이스에서 'case football :'줄에서 오류가 발생합니다. 축구는 변수가 아니므로 String으로 사용해야합니다.

아래 코드를 사용하십시오.

<html> 
<body> 
<script> 
(function(){ 
var dayEvents={ 
    football:0, 
    school:0, 
    video_games:0, 
    watch_tv:0, 
    coding:0, 
    container:[], 
    insert:function(evt){ 
    this.container.push(evt); 

    }, 
    get:function(){ 
     sort.call(this); 
    } 
} 
function sort(){ 

    for(i=0;i<this.container.length;i++){ 


     this.container[i].forEach(function(elements,index,array){ 
       console.log(this); 
       switch(elements){ 
        case 'football': 
         (this.football)++; 
         break; 
        case 'school': 
         (this.school)++; 
         break; 
        case 'video_games': 
         (this.video_games)++; 
         break; 
        case 'watch_tv': 
         (this.watch_tv)++; 
         break; 
        case 'coding': 
         (this.coding)++; 
         break;      

       } 

      }, this); //instead of 'this', you can also pass 'dayEvents' 


    } 

} 
dayEvents.insert(['football','school','video_games','watch_tv','coding']); 
dayEvents.insert(['football','school','coding']); 
dayEvents.insert(['school','video_games','watch_tv','coding']); 
dayEvents.insert(['football','video_games','coding']); 
dayEvents.insert(['school','watch_tv','coding']); 
dayEvents.insert(['football','school','video_games','watch_tv','coding']); 
dayEvents.insert(['football','school','video_games','coding']); 
dayEvents.get(); 
console.log(dayEvents.football); 
})(); 
</script> 
</body> 
</html> 

희망이 도움이됩니다. 그것이 작동하는지 알려주세요

+1

잘 작동합니다 :) –

관련 문제