백본

2012-06-10 14 views
0

에 ID의 필터 배열은 .set 사용은 그래서 같은 객체 식별자의 배열을 얻을 수 Underscore.js의 _.filter를 사용 정렬.백본

for (var i = 0; i < downstreamMeters.length; i++) { 
    var sum = 0; 
    inputMeters = downstreamMeters[i].get("inputmeters"); 
    for (var i = 0; i < inputMeters.length; i++) { 
     var flow = parseFloat(that.collection.get(inputMeters[i]).get("adjustedflow")); 
     sum += flow; 
    } 
    downstreamMeters[i].set({incrementalflow: sum}); 
} 

그러나, 다음과 같은 에러가 발생합니다 :

Uncaught TypeError: Cannot call method 'set' of undefined 

내가 downstreamMeters 배열을 확인하고 그것의 오른쪽 개체가 나는 감각이 작업을 수행 할 수 있도록 거라 생각 했어요. 배열의 각 모델에 대한 속성을 설정하려면 어떻게해야합니까?

+0

확인하여'downstreamMeters' 배열이 어떤 요소가있는 경우. – sntran

+1

당신이 보여주는 작품은 잘 작동합니다 (http://jsfiddle.net/ambiguous/D4bT3/). "Some code ..."가 어떤 식 으로든 "i"또는 "downstreamMeters"를 변경합니까? –

+0

@muistooshort '\\ Some code' _가 문제를 일으키는 것으로 보입니다. '\\ Some code'를 실제로 for 루프로 갱신했습니다. 이것은 for 루프입니다. for 루프를 다른 루프에 넣는 것은 나쁜 생각입니까? 나는 JS를 처음 접했고 내가 원하는 것을 성취 할 것이라고 생각했다. – chrishenn

답변

0

말하면 for(var i = 0; ...)은 약간 오해의 소지가 있습니다. JavaScript는 모두 var 선언을 가장 가까운 범위의 맨 위로 올려 놓고 for 루프는 자체 범위를 만들지 않습니다.

for (var i = 0; i < downstreamMeters.length; i++) { 
    var sum = 0; 
    inputMeters = downstreamMeters[i].get("inputmeters"); 
    for (var i = 0; i < inputMeters.length; i++) { 
     var flow = parseFloat(that.collection.get(inputMeters[i]).get("adjustedflow")); 
     sum += flow; 
    } 
    downstreamMeters[i].set({incrementalflow: sum}); 
} 

이 동일하다 : 결과는이 때문이다

var i, sum, flow; 
for (i = 0; i < downstreamMeters.length; i++) { 
    sum = 0; 
    inputMeters = downstreamMeters[i].get("inputmeters"); 
    for (i = 0; i < inputMeters.length; i++) { 
     flow = parseFloat(that.collection.get(inputMeters[i]).get("adjustedflow")); 
     sum += flow; 
    } 
    downstreamMeters[i].set({incrementalflow: sum}); 
} 

지금 당신은 당신이 정확하게 외부 및 내부 루프에서 같은 i를 사용하고있는 것을 볼 수 있습니다. 루프를 처음 실행할 때 은 downstreamMeters[i].set(...)이라고 할 때 inputMeters.length이됩니다. 분명히 inputMeters.length > downstreamMeters.length이므로 downstreamMeters 끝에서 실행됩니다. 당신이 배열의 끝을지나 인 배열의 요소에 액세스하려고하면, 당신은 undefined을 얻을하고

Cannot call method 'set' of undefined.

오류가있다.

중첩 루프 괜찮습니다하지만 당신은 다른 변수를 사용한다 :

var i, j, sum, inputMeters; 
for (i = 0; i < downstreamMeters.length; i++) { 
    sum = 0; 
    inputMeters = downstreamMeters[i].get("inputmeters"); 
    for (j = 0; j < inputMeters.length; j++) 
     sum += parseFloat(that.collection.get(inputMeters[j]).get("adjustedflow")); 
    downstreamMeters[i].set({incrementalflow: sum}); 
} 
+0

대단히 고마워요! 나는 디버깅을했고 inputMeters.length는 실제로 downstreamMeters.length보다 컸다. – chrishenn

+0

@chrishenn : 그렇지 않다면 외부 루프가 끝나지 않을 것입니다. –