2014-09-29 2 views
0

계속해서 나에게 TypeError를 제공합니다. undefined는 ('grades [2] .length'를 평가하는) 객체가 아닙니다. 도움?두 개의 배열 배열을 사용하는 JavaScript 함수

이 코드에 대한 질문은 두 개의 학년 배열을 취하는 첫 번째 학생의 평균이 더 높으면 "첫 번째"또는 두 번째 학생의 평균이 더 높은 경우 "둘째"를 반환하는 compare라는 JavaScript 함수를 작성합니다. 평균.

function compare (grades) 
{ 
    var sum1 = 0; 
    var length1 = grades[1].length; 
    for (i=0; i<grades[1].length; i++) 
    { 
    sum1 += grades[1]; 
    var avg1 = sum1/length1; 
    } 

    var sum2 = 0; 
    var length2 = grades[2].length; 
    for (var i=0; i<grades[2].length; i++) 
    { 
    sum2 += grades[2]; 
    var avg2 = sum2/length2; 
    } 

    if (avg1 > avg2) 
    { 
    return "first"; 
    } 
    if (avg1 < avg2) 
    { 
    return "second"; 
    } 
} 
+3

아시나요? 자바 스크립트 배열은 요소 1이 아니라 요소 0으로 시작합니다. 당신의 for 루프는 이것을 알고있는 것처럼 보이지만, 성적 [1], 성적 [2]은 그렇지 않다고 제안합니다. – Paul

+2

'compare()'는 어떻게 호출 되나요? –

+0

입문 CS 과정의 질문입니까? 이전 질문 중 하나가 "calculate GPA"입니까 (그레이드로 보내는 편지)입니까? –

답변

1

이 시도 :

var array1 = [1,2,3,4,5]; 
var array2 = [1,2,3,4,7]; 

function compare(arr1 , arr2) { 
    var aver1 = arr1.reduce(function(a, b) { return a + b; }, 0)/arr1.length; 
    var aver2 = arr2.reduce(function(a, b) { return a + b; }, 0)/arr2.length; 
    if(aver1 > aver2) { 
     alert('First'); 
    } else if (aver1 < aver2) { 
     alert('Second'); 
    } 
} 

compare(array1, array2); 

참고 :을 당신이 IE < = 8

.reduce()을 사용하지 않는 것으로 가정하고하는 자바 스크립트 배열에 기능이 내장되어 있습니다. 위의 MDN 문서 링크를 클릭하면 위에서 사용한 것과 비슷한 배열을 합하는 방법에 대한 예제를 볼 수 있습니다.

0

자신을 반복하지 않고 배열에 함수를 추가 할 수 있습니다.

Array.prototype.avg = function(){ 
    // Note: "this" is a special JS variable, contains the array "calling" .avg() 
    // So this.length is the length of the array, and this[0], this[1],... the data 
    for(var i=0,l=this.length, sum=0; i<l; ++i) sum+=this[i] 
    return sum/this.length 
} 

SallyPerfect = [100,100,100,100,95]; // She always gets good grades 
LittleBobbyTables = [60,70,60,70,314.159]; // He plays too many games, but reads xkcd 

alert("SallyPerfect avg is "+SallyPerfect.avg()); 
alert("LittleBobbyTables avg is "+LittleBobbyTables.avg()); 

var whoIsBetter = (SallyPerfect.avg()>LittleBobbyTables.avg())? "SallyPerfect": "LittleBobbyTables"; 
// you dont have to repeat yourself here, either, but it would require more code. 

alert(whoIsBetter+" had the best average grade"); 

DEMO : 물론 http://jsfiddle.net/bp9hvywe/

,이 숙제 질문의 경우, 당신은 당신이 말한대로 수행하고 함수를 작성 (적절한 인용이나 속성 포함)이 코드의 일부를 사용한다는 것을 "first"또는 "second"를 반환합니다.

+0

This 이번 주말에 보았던 입문 CS 과정의 숙제에서 똑같은 질문입니다. 그래서 나는 이것이 또한 OP를위한 숙제 문제 일 것임에 틀림 없다. 그리고 대부분의 OP는 Array.prototype이 무엇인지 이해하지 못할 것이다. –

+0

나는 내가 교육학에 관해 의견이 맞지 않는다고 생각한다. 무엇보다도 이것은 평균을 인쇄하는 법을 가르쳐줍니다. OP가 평균 인쇄를 시도했다면 OP가 그의 코드가 평균값 중 하나만 계산한다는 것을 깨닫게 될 것입니다. 나는 그가 강의를 보지 않는다고 의심하여 ​​여기에 나타난다. 어쩌면 너무 익숙해지기까지 오랜 시간이 걸리기 때문에 그는 지루해합니다. 차라리 그는 더 많은 것을 배우고 나서 그것을 손에 넣기 위해 멍청하기를 배웁니다. OTOH가 정말로 신경 쓰지 않는다면, 나는 사람들을 위해 쓰고 있습니다. – Paul

+0

나는 강의 (@ 폴)에서주의를 기울인다. 그러나 내가 죽었을 때 나는 두 가지를 놓쳤다. 그래서 제가 도움이 필요합니다. –

관련 문제