Уявімо, у нас є масив цілих чисел, як це:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
Середнє значення виходить за такою формулою
A = (1 / n) Σxi (при i = 1 до n) ... Отже: x1 / n + x2 / n + ... + xn / n
Ділимо поточне значення на кількість значень і додаємо попередній результат до повернутого значення.
Підпис методу скорочення є
reduce(callback[,default_previous_value])
Функція зменшення зворотного виклику приймає такі параметри:
- p : Результат попереднього розрахунку
- c : Поточне значення (з поточного індексу)
- i : Поточне значення індексу елемента масиву
- a : Поточний скорочений масив
Параметр другого зменшення - це значення за замовчуванням ... (Використовується у випадку, якщо масив порожній ).
Тож середній метод зменшення буде:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
Якщо вам зручніше, ви можете створити окрему функцію
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
А потім просто зверніться до підпису методу зворотного дзвінка
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
Або безпосередньо збільшити прототип масиву ..
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
Можна розділити значення кожного разу, коли викликається метод зменшення ..
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
Або ще краще , використовуючи раніше визначений Array.protoype.sum ()
метод, оптимізуйте процес мого виклику підрозділу лише один раз :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
Потім на будь-якому об’єкті масиву області дії:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
Примітка: порожній масив із поверненням бажання NaN є більш правильним, ніж 0, на мій погляд, і може бути корисним у конкретних випадках використання.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
було б набагато приємніше.