2014-10-15 5 views
1

Я пытаюсь изучить Javascript. Я построил следующий код, чтобы найти среднее значение из массива чисел. Он работает за исключением Последнее возвращаемое значение всегда NaN. Я не могу понять, почему. Если я перемещу эту часть за пределы блока, она, похоже, вообще забывает, что должна означать переменная сумма. Есть ли какой-то эквивалент типа глобальной переменной, который я должен использовать для JS?Средние значения JavaScript

var average = function(myarray) { 
    sum = 0; 
    for (counter = 0; counter <= myarray.length; counter++) { 
     sum = sum + myarray[counter]; 
     average = sum/myarray.length; 
     console.log(average); 
    }; 
} 

average([1, 2, 3]) 
+4

Вы '<= myarray.length', но последнее значение на единицу меньше длины, поэтому перейти на'

+0

Следует также вычислить среднее значение ПОСЛЕ окончания цикла 'for', потому что его нужно только вычислить. – jfriend00

+0

Кроме того, 'sum/myarray.length' не будет средним,' sum/(counter + 1) 'is (если вы после выполнения среднего). Если вы хотите всего всего среднего, @ jfriend00 - ваш друг. – Amadan

ответ

1

Изменить

counter <= myarray.length 

в

counter < myarray.length 

потому, что индексы начинаются с 0.

Полный пример:

var average = function(myarray) { 
    var sum = 0; 
    for (var counter = 0; counter < myarray.length; counter++) { 
    sum += myarray[counter]; 
    } 

    return sum/myarray.length; 
} 

console.log(average([1,2,3])); 

JSBin Демо: http://jsbin.com/siyugi/1/edit

+0

Лучшие ответы используют слова для описания того, что было изменено и почему. Также можно просто использовать '.reduce()' в массиве. – jfriend00

+0

@ jfriend00 благодарит за отзыв. –

1

myarray[myarray.length] является undefined, который отравляет ваше вычисление с NaN (не числом).

Просто измените его

for(counter = 0; counter < myarray.length; counter ++) { 
// ... 
} 
0

Так как вы только учитесь, вы должны знать, что это хорошая практика, чтобы не использовать .length в цикле, как это. Это заставляет код проверять длину вашего массива на каждом цикле. И помните, что .length возвращает количество элементов в массиве; но индекс массива начинается с 0.

for(var counter = 0, length = myarray.length; counter < length; counter++){ 
} 

Был бы правильный способ сделать это.

0
  1. Не используйте переменные без объявления их var ключевого слова, иначе они станут глобальными свойствами.

  2. Массивы JavaScript представляют собой массивы с нулевым индексом. Итак, если размер массива равен 3, то к первому элементу будет обращено значение 0 и последнее с 2. JavaScript очень прощает, поэтому, когда вы обращаетесь к элементу с недопустимым индексом в массиве, он просто возвращает undefined ,

  3. На итерации вы заменяете текущий объект функции значением average. Таким образом, последующие вызовы average потерпят неудачу, так как average больше не является объектом функции.

  4. Это хорошая практика, чтобы функция возвращала вычисленное значение вместо того, чтобы печатать значение, чтобы оно не нарушало Single Responsibility Principle.

В вашем случае,

for (counter = 0; counter <= myarray.length; counter++) { 

В counter работает до последнего индекса массива + 1. Так как она возвращает undefined в последней итерации, JavaScript возвращает NaN в арифметической операции.

console.log(1 + undefined); 
# NaN 

Таким образом, вы должны изменить код, как это

function Average(myarray) { 
    var sum = 0, counter; 
    for (counter = 0; counter < myarray.length; counter++) { 
     sum = sum + myarray[counter]; 
    } 
    return sum/myarray.length; 
} 

Если вы заинтересованы, вы можете вычислить сумму с Array.prototype.forEach, как этот

function Average(myarray) { 
    var sum = 0; 
    myarray.forEach(function(currentNumber) { 
     sum += currentNumber; 
    }); 
    return sum/myarray.length; 
} 

Даже лучше, вы можете рассчитать сумму с помощью Array.prototype.reduce, например

function Average(myarray) { 
    return myarray.reduce(function(sum, currentNumber) { 
     return sum + currentNumber; 
    }, 0)/myarray.length; 
} 
0

Вы можете вычислить среднее значение массива чисел следующим образом:

var avg = c => c.reduce((a,b) => a +b)/c.length; 
avg([1,2,3]) 
Смежные вопросы