Подтвердить что ты не робот

Поиск среднего значения массива с использованием JS

Я искал и не нашел простого вопроса и ответа на переполнение стека, глядя на поиск среднего значения массива.

Это массив, который у меня есть

var grades = [80, 77, 88, 95, 68];

Сначала я подумал, что ответ на эту проблему будет примерно таким:

var avg = (grades / grades.length) * grades.length
console.log(avg)

Однако это дало мне выход NaN.

Итак, я пробовал это:

for ( var i = 0; i < grades.length; i ++){
    var avg = (grades[i] / grades.length) * grades.length
}
console.log(avg)

Это дало мне результат 68. (Я не уверен, почему).

Таким образом, у меня есть два вопроса. 1. Почему мой выпуск 68? и 2. Может ли кто-нибудь помочь мне с нахождением среднего значения массива?

4b9b3361

Ответ 1

Вы вычисляете среднее значение путем добавления всех элементов, а затем деления на количество элементов.

var total = 0;
for(var i = 0; i < grades.length; i++) {
    total += grades[i];
}
var avg = total / grades.length;

Причина, по которой вы получили 68 в качестве результата, заключается в том, что в вашем цикле вы продолжаете переписывать свое среднее значение, поэтому конечное значение будет результатом вашего последнего вычисления. И ваше разделение и умножение на grades.length отменяют друг друга.

Обновление: добавлено ; в последней строке примера кода, чтобы избежать ошибки.

Ответ 2

Что касается второй части вашего вопроса вы можете использовать reduce хороший эффект здесь:

const grades = [80, 77, 88, 95, 68];

function getAvg(grades) {
  const total = grades.reduce((acc, c) => acc + c, 0);
  return total / grades.length;
}

const average = getAvg(grades);
console.log(average);

Ответ 3

С ES6 вы можете превратить решение Andy в однострочный:

let average = (array) => array.reduce((a, b) => a + b) / array.length;
console.log(average([1,2,3,4,5]));

Ответ 4

Один лайнер претендента принял

const average = arr => arr.reduce((sume, el) => sume + el, 0) / arr.length;

а затем

average([1,2,3,4]); // 2.5

Ответ 5

Режим MacGyver, только для lulz

var a = [80, 77, 88, 95, 68];

console.log(eval(a.join('+'))/a.length)

Ответ 6

Нет встроенной функции, но вы можете использовать ее для получения суммы,

Array.prototype.sum = function() {
    return this.reduce(function(a,b){return a+b;});
};

затем разделите длину массива, например:

var arr = [1,2,3,4,5]
console.log(arr.sum() / arr.length)

Ответ 7

Это можно просто сделать с помощью одной операции сокращения следующим образом:

var avg = [1,2,3,4].reduce((p,c,_,a) => p + c/a.length,0);
console.log(avg)

Ответ 8

var total = 0
grades.forEach(function (grade) {
    total += grade        
});
console.log(total / grades.length)

Ответ 9

Средняя функция, которую вы можете сделать:

const getAverage = (arr) => arr.reduce((p, c) => p + c, 0) / arr.length

Кроме того, я предлагаю использовать инструмент open source для popoular, например. Lodash:

const _ = require('lodash')
const getAverage = (arr) => _.chain(arr)
 .sum()
 .divide(arr.length)
 .round(1)
 .value()

Ответ 10

ответьте на ваш вопрос 1.

for ( var i = 0; i < grades.length; i ++){
    var avg = (grades[i] / grades.length) * grades.length
}

avg объявляется в каждом цикле. Таким образом, в конце цикла avg имеет значение последнего элемента в массиве: 68 * 5/5

Ответ 11

Вы можете использовать функции отображения/уменьшения javascript для поиска среднего значения. Сократить будет суммировать их, и карта найдет среднее значение.

var avg = grades.map((c, i, arr) => c / arr.length).reduce((p, c) => c + p);

Ответ 12

Написание функции для самого среднего - это сумасшествие. Вот почему существуют модули. Я нашел math.js

В моем файле HTML:

  <script src="http://cdnjs.cloudflare.com/ajax/libs/mathjs/3.2.1/math.min.js"></script>

(или вы можете скачать его)

В моем JS-коде:

math.mean([1,2,3]) // =2
math.mean(1,2,3) // the same
math.mean(grades)