Поиск среднего значения массива с использованием 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. Может ли кто-нибудь помочь мне с нахождением среднего значения массива?
Ответы
Ответ 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)