2014-09-29 2 views
0

Это продолжает давать мне TypeError: undefined не является объектом (оценивая «оценки [2] .length»). Помогите?Функция JavaScript, которая принимает два массива оценок

Вопрос для этого кода: написать функцию 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

Знаете ли вы, массивы Javascript начинаются с элемента 0, а не элемента 1? Кажется, что ваши петли, похоже, знают это, но оценки [1], оценки [2] не предполагают. – Paul

+2

Как вызывается 'compare()'? –

+0

Это вопрос во вводном курсе CS? Был ли один из предыдущих вопросов «calculateGPA» (письмо для оценки) или что-то в этом роде? –

ответ

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() является встроенной функцией на Javascript массивам. Если вы перейдете по ссылке выше к документации по MDN, вы увидите, что они приводят пример того, как суммировать массив, аналогичный используемому выше.

0

Вы можете добавить свою собственную функцию в Array вместо того, чтобы повторять себя.

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/

Конечно, если это домашнее задание вопрос, вы должны сделать, как вы сказали, и использовать часть этого кода (с надлежащей цитатой или атрибуцией), чтобы написать функцию, которая возвращает «первый» или «второй».

+0

Это это тот же самый вопрос в домашней работе вступительного курса CS, который я видел в эти выходные. Поэтому я считаю, что это тоже вопрос домашней работы для OP, и, скорее всего, OP не поймет, что такое «Array.prototype». –

+0

Думаю, я не согласен с педагогикой. Среди прочего, это учит печатать средние значения. Если бы ОП попробовал печатать только средние значения, это привело бы к тому, что ОП понял, что его код вычисляет только один из средних значений, а не оба. Я подозреваю, что он не смотрит лекцию, таким образом, появляется здесь. Может быть, ему надоедает лекция, потому что так много времени, чтобы учиться так мало. Я бы предпочел, чтобы он учился больше, а затем научился тупать его, чтобы передать его. Если OTOH он действительно не заботится, тогда я пишу для людей, которые будут. – Paul

+0

Я обращаю внимание на лекции (@ Paul), но я пропустил два, поскольку я был мертв. Вот почему мне нужна помощь. –

Смежные вопросы