Як обчислити суму та середнє значення елементів у масиві?


177

У мене виникають проблеми з додаванням усіх елементів масиву, а також із усередненням їх. Як би я це зробив і реалізував це за допомогою коду, який у мене зараз є? Елементи повинні бути визначені так, як у мене це є нижче.

<script type="text/javascript">
//<![CDATA[

var i;
var elmt = new Array();

elmt[0] = "0";
elmt[1] = "1";
elmt[2] = "2";
elmt[3] = "3";
elmt[4] = "4";
elmt[5] = "7";
elmt[6] = "8";
elmt[7] = "9";
elmt[8] = "10";
elmt[9] = "11";

// Problem here
for (i = 9; i < 10; i++){
  document.write("The sum of all the elements is: " + /* Problem here */ + " The average of all the elements is: " + /* Problem here */ + "<br/>");
}   

//]]>
</script>

26
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]було б набагато приємніше.
Джеймс Маклафлін

Відповіді:


134
var sum = 0;
for( var i = 0; i < elmt.length; i++ ){
    sum += parseInt( elmt[i], 10 ); //don't forget to add the base
}

var avg = sum/elmt.length;

document.write( "The sum of all the elements is: " + sum + " The average is: " + avg );

Просто перейдіть через масив, оскільки ваші значення - це рядки, їх попередньо потрібно перетворити на ціле число. А середнє - це лише сума значень, поділена на кількість значень.


13
Єдине поліпшення, яке я міг би зробити, було б замінити for(var i = 0; i < elmt.length; i++;)наfor(var i = 0, l = elmt.length; i < l; i++)
Dan D.

5
не бути тим хлопцем і не бути темою, але це добра практика, щоб включити аргумент radix в parseInt (). Під цим я маю на увазі sum += parseInt(elmt[i], 10);припущення, що elmt [i] є базовим 10. посилання
Райдер Брукс

9
Слідкуйте за поділами на 0 (elmt.length could me 0)
caulitomaz

2
@BramVanroy Коротка історія: Ні, вона не встановлює "я" кожен раз. Довга історія: рішенням DanD є підвищення продуктивності / швидкості, тому що перевірка довжини масиву кожна ітерація відбувається повільніше, ніж фактично зберігання довжини в локальній змінній та посилання на неї кожної ітерації.
CatalinBerta

9
@VitoGentile та DanD зведення коду для підвищення продуктивності, яке сучасні браузери все одно збирають, не повинно бути найкращою практикою.
nauti

496

Рішення, яке я вважаю більш елегантним:

const sum = times.reduce((a, b) => a + b, 0);
const avg = (sum / times.length) || 0;

console.log(`The sum is: ${sum}. The average is: ${avg}.`);

1
Це не працюватиме на <= IE8, оскільки він не підтримує Array.prototype.reduce () Див. Докладніше на developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
aabele

14
із сукупною sum/times.lengthvar avg = times.reduce(function(p,c,i){return p+(c-p)/(i+1)},0);
ковзною середньою мірою

6
@zamnuts Я з вами, я вважаю, що коментар Thor84no повністю не в змозі - я був би радий, щоб мене звільнили з місця, яке вважає array.reduce занадто складним. Однак я також не використовував би ваш код, оскільки простий факт у ньому є поділ і два додаткові доповнення на будь-якому кроці, який ніколи не буде настільки ефективним, як окремий поділ наприкінці
gotofritz

12
У ES2015 це зовсім елегантніше. times.reduce((a,b) => (a+b)) / times.length;
Рей Фосс

12
@furf через 5 років, як це виглядає у багатьох сучасних браузерах, тим елегантніше "зменшити ()" швидше (або так само швидко). У Chrome 65 та більшості знімків Firefox краще на цьому тесті.
Сер Роберт

116

ES6

const average = arr => arr.reduce( ( p, c ) => p + c, 0 ) / arr.length;
    
const result = average( [ 4, 4, 5, 6, 6 ] ); // 5
    
console.log(result);


3
Покращено:Array.prototype.average = function () { var sum = 0, j = 0; for (var i = 0; i < this.length, isFinite(this[i]); i++) { sum += parseFloat(this[i]); ++j; } return j ? sum / j : 0; };
Гілад Пелег

42
Будь ласка, не поширюйте об’єкти, які не створені вашим кодом.
Бред

1
UPDATE не працює для: ["RER", "4", "3re", 5, новий Object ()], середнє значення (); повертає 0 замість очікуваних 4,5
Luckylooke

4
І це епічно зазнає краху, коли немає тривалості
Джиммі Кейн

2
@JimmyKane Ні, воно повернеться NaN.
bzeaman

37

Обчислення середнього (середнього) значення за допомогою зниження та ES6:

const average = list => list.reduce((prev, curr) => prev + curr) / list.length;

const list = [0, 10, 20, 30]
average(list) // 15

дуже повільно порівняно з простим додаванням на основі циклу зі змінною сумою jsben.ch/0xUus
PirateApp

Тут різниця в 25%. Не так вже й погано, я думаю.
Майкл

20

як правило, середнє значення для зменшення однолінійної лінії є таким

elements.reduce(function(sum, a,i,ar) { sum += a;  return i==ar.length-1?(ar.length==0?0:sum/ar.length):sum},0);

спеціально для запитання

elements.reduce(function(sum, a,i,ar) { sum += parseFloat(a);  return i==ar.length-1?(ar.length==0?0:sum/ar.length):sum},0);

ефективна версія - це як

elements.reduce(function(sum, a) { return sum + a },0)/(elements.length||1);

Зрозуміти скорочення масиву Javascript за 1 хвилину http://www.airpair.com/javascript/javascript-array-reduce

як зазначає gotofritz, схоже, що Array.reduce пропускає невизначені значення. тож ось виправлення:

(function average(arr){var finalstate=arr.reduce(function(state,a) { state.sum+=a;state.count+=1; return state },{sum:0,count:0}); return finalstate.sum/finalstate.count})([2,,,6])

2
elements.length!=0?elements.length:1 можна також записати так: elements.length || 1 який коротший і легший для читання.
4рзаель

2
Майте на увазі, що це працює лише для масивів без порожніх прогалин
gotofritz

1
Пропозиція: Додайте немініфіковані (насправді просто симпатичні друковані) версії фрагментів коду, щоб люди могли їх читати. Я б редагував їх у собі, але мені не подобається міняти відповіді людей у ​​цій мірі.
Джастін Морган

16

Уявімо, у нас є масив цілих чисел, як це:

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, на мій погляд, і може бути корисним у конкретних випадках використання.


13

Ви також можете використовувати lodash , _.sum (масив) та _.mean (масив) у математичній частині (також є інші зручні речі).

_.sum([4, 2, 8, 6]);
// => 20
_.mean([4, 2, 8, 6]);
// => 5

6

Не найшвидший, але найкоротший, і в одному рядку використовується карта () та зменшити ():

var average = [7,14,21].map(function(x,i,arr){return x/arr.length}).reduce(function(a,b){return a + b})

1
можливо коротше, [7,14,21].reduce((avg,e,i,arr)=>avg+e/arr.length,0);але з різною поведінкою на порожньому масиві. Якщо ви хочете, щоб результат був порожнім на порожньому масиві:[].reduce((a,e,i,arr)=>(a?a:0)+e/arr.length,"")
Вален

Мапа @Tobiq та зменшення є досить стандартними, оскільки ES5 (стандартизовано у 2009 році)
Йоганн Ечаваррія

for (var avg = 0, length = i = arr.length; i--;) avg += arr[i] / lengthНабагато чіткіше, коротше і набагато швидше
Tobiq

2
@Tobiq, ваш код - все, але зрозумілий. Цей тип циклу на перший погляд не зрозумілий.
Поркопек

5

Один з підступних способів ви могли це зробити, хоча це вимагає використання (сильно ненависного) eval ().

var sum = eval(elmt.join('+')), avg = sum / elmt.length;
document.write("The sum of all the elements is: " + sum + " The average of all the elements is: " + avg + "<br/>");

Я просто подумав, що я опублікую це як один із тих варіантів "поза коробкою". Ніколи не знаєш, хитрість може дати тобі (або забрати) точку.


+1 Приємний ефективний одноколісний лайнер! Якщо це JavaScript у браузері Javascript, єдине можливе eval()питання, яке я бачу, - це те, що вам потрібно бути впевненим, що масив містить лише цифри (що, звичайно, справедливо і для всіх інших відповідей тут). Нечислові записи збійться із символом a ReferenceErrorабо SyntaxError, except nested arrays of numbers which introduce `, викликаючи неправильний числовий підсумок. І, звичайно, на сервері JS, наприклад, node.js, тоді, природно, eval()можуть виникнути проблеми безпеки. Але це виглядає ідеально для будь-яких добре структурованих клієнтів.
user56reinstatemonica8

1
Насправді, може бути, проблема з продуктивністю, щоб включити eval()подібне - дивіться розділ про ефективність nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderpted
user56reinstatemonica8

5

Я використовую ці методи в моїй особистій бібліотеці:

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

Array.prototype.average = Array.prototype.average || function() {
  return this.sum() / (this.length || 1);
}

EDIT: Щоб їх використовувати, просто запитайте масив на його суму або середнє значення, наприклад:

[1,2,3].sum() // = 6
[1,2,3].average() // = 2

Акуратне впровадження все-таки, я би реалізував суму, щоб використовувати цикл замість зменшення. Все ще дуже чисто кодований, хоча.
XDS

5

У браузерах, готових до ES6, ця поліфіл може бути корисним.

Math.sum = (...a) => Array.prototype.reduce.call(a,(a,b) => a+b)

Math.avg = (...a) => this.sum(...a)/a.length;

Ви можете поділитися тим самим методом виклику між Math.sum, Math.avg та Math.max, як, наприклад,

var maxOne = Math.max(1,2,3,4) // 4;

ви можете використовувати Math.sum як

var sumNum = Math.sum(1,2,3,4) // 10

або якщо у вас є масив для підбиття підсумків, ви можете використовувати

var sumNum = Math.sum.apply(null,[1,2,3,4]) // 10

так як

var maxOne = Math.max.apply(null,[1,2,3,4]) // 4

Замість того, щоб додавати методи Array.prototype, я думаю, що додавання теми до Mathоб’єкта - кращий вибір - всі вони є "обробниками чисел".
Oboo Cheng

3

Ось швидке доповнення до об’єкта «Math» у javascript, щоб додати до нього «середню» команду !!

Math.average = function(input) {
  this.output = 0;
  for (this.i = 0; this.i < input.length; this.i++) {
    this.output+=Number(input[this.i]);
  }
  return this.output/input.length;
}

Тоді я маю це доповнення до об'єкта «Математика» для отримання суми!

Math.sum = function(input) {
  this.output = 0;
  for (this.i = 0; this.i < input.length; this.i++) {
    this.output+=Number(input[this.i]);
  }
  return this.output;
}

Тож все, що ти робиш - це

alert(Math.sum([5,5,5])); //alerts “15”
alert(Math.average([10,0,5])); //alerts “5”

І де я поміщаю масив заповнювачів просто передаю вашій змінній (введення, якщо вони є числами, може бути рядком через його розбору на число!)


1

встановіть свій лічильник циклу на 0 .... ви отримуєте елемент 9, а потім закінчите так, як зараз. Інші відповіді - це основна математика. Використовуйте змінну для зберігання суми (потрібно передати рядки в ints) та розділити на довжину масиву.


1

Почнемо з визначення всіх змінних, які ми плануємо використовувати. Ви помітите, що для numbersмасиву я використовую буквальне позначення, []а не метод конструктора array(). Крім того, я використовую коротший метод для встановлення кількох змінних на 0.

var numbers = [], count = sum = avg = 0;

Далі я заповнюю свій порожній масив зі значеннями від 0 до 11. Це спрямоване на вихідну точку відліку. Зверніть увагу, як я натискаю на масив count++. Це підштовхує поточне значення лічильника, а потім збільшує його в наступний раз.

while ( count < 12 )
    numbers.push( count++ );

Нарешті, я виконую функцію "для кожного" числа в масиві чисел. Ця функція буде обробляти одне число за раз, яке я визначаю як "n" в тілі функції.

numbers.forEach(function(n){
  sum += n; 
  avg = sum / numbers.length;
});

Зрештою, ми можемо вивести і sumзначення, і avgзначення на нашу консоль, щоб побачити результат:

// Sum: 66, Avg: 5.5
console.log( 'Sum: ' + sum + ', Avg: ' + avg );

Дивіться це в дії онлайн за адресою http://jsbin.com/unukoj/3/edit


1

Я просто будую на відповіді Абденнора TOUMI. ось причини:

1.) Я погоджуюсь з Бредом, я не думаю, що це гарна ідея розширити об’єкт, який ми не створили.

2.) array.lengthточно надійний в JavaScript, я вважаю за краще Array.reducebeacuse a=[1,3];a[1000]=5;, тепер a.lengthповернеться 1001.

function getAverage(arry){
    // check if array
    if(!(Object.prototype.toString.call(arry) === '[object Array]')){
        return 0;
    }
    var sum = 0, count = 0; 
    sum = arry.reduce(function(previousValue, currentValue, index, array) {
        if(isFinite(currentValue)){
            count++;
            return previousValue+ parseFloat(currentValue);
        }
        return previousValue;
    }, sum);
    return count ? sum / count : 0; 
};

1
Array.prototype.avg=function(fn){
    fn =fn || function(e,i){return e};
    return (this.map(fn).reduce(function(a,b){return parseFloat(a)+parseFloat(b)},0) / this.length ) ; 
};

Тоді :

[ 1 , 2 , 3].avg() ;  //-> OUT : 2

[{age:25},{age:26},{age:27}].avg(function(e){return e.age}); // OUT : 26

1

У вічнозелених браузерах можна використовувати функції стрілок avg = [1,2,3].reduce((a,b) => (a+b);

Запустивши його 100 000 разів, різниця в часі між підходом до циклу та зменшенням незначна.

s=Date.now();for(i=0;i<100000;i++){ n=[1,2,3]; a=n.reduce((a,b) => (a+b)) / n.length };
console.log("100k reduce took " + (Date.now()-s) + "ms.");

s=Date.now();for(i=0;i<100000;i++){n=[1,2,3]; nl=n.length; a=0; for(j=nl-1;j>0;j--){a=a+n[j];} a/nl };
console.log("100k for loop took " + (Date.now()-s) + "ms.");

s=Date.now();for(i=0;i<1000000;i++){n=[1,2,3]; nl=n.length; a=0; for(j=nl-1;j>0;j--){a=a+n[j];} a/nl };
console.log("1M for loop took " + (Date.now()-s) + "ms.");

s=Date.now();for(i=0;i<1000000;i++){ n=[1,2,3]; a=n.reduce((a,b) => (a+b)) / n.length };
console.log("1M reduce took " + (Date.now()-s) + "ms.");

/* 
 * RESULT on Chrome 51
 * 100k reduce took 26ms.
 * 100k for loop took 35ms.
 * 10M for loop took 126ms.
 * 10M reduce took 209ms.
 */


1
Вам потрібно дізнатися більше про console.time&console.timeEnd
Abdennour TOUMI

@AbdennourTOUMI Спасибі за підказку, я пам’ятаю про це ... однак це нестандартно і не на трасі стандартів. developer.mozilla.org/en-US/docs/Web/API/Console/timeEnd
Рей Фосс

1
Я знаю, що я знімаю оригінальні запитання, але як щодо використання performance.now () для вимірювань продуктивності?
deejbee

@deejbee Це пропонує точність з плаваючою точкою ... але це також більш детально і менш сумісно. Встановлення маркерів було б корисно в реальному коді світу
Рей Фосс

1

Середній найкоротший вкладиш:

let avg = [1,2,3].reduce((a,v,i)=>(a*i+v)/(i+1));

Підсумок найкоротшого вкладиша:

let sum = [1,2,3].reduce((a,b)=>a+b);

0

Тільки для ударів:

var elmt = [0, 1, 2,3, 4, 7, 8, 9, 10, 11], l = elmt.length, i = -1, sum = 0;
for (; ++i < l; sum += elmt[i])
    ;
document.body.appendChild(document.createTextNode('The sum of all the elements is: ' + sum + ' The average of all the elements is: ' + (sum / l)));

0

Я думаю, що ми можемо робити так

var k=elmt.reduce(function(a,b){return parseFloat(a+parseFloat(b));})
var avg=k/elmt.length; 
console.log(avg);

Я використовую parseFloat двічі, тому що коли 1) ви додасте (а) 9 + b ("1") число, тоді результат буде "91", але ми хочемо доповнити. тому я використав parseFloat

2) Коли додавання (a) 9 + parseFloat ("1") відбудеться, хоча результат буде "10", але він буде в рядку, який ми не хочемо, щоб я знову використовував parseFloat.

Я сподіваюся, що мені все зрозуміло. Пропозиції вітаються


0

Ось мій спосіб новобранця просто знайти середній рівень. Сподіваюся, це комусь допомагає.

function numAvg(num){
    var total = 0;
    for(var i = 0;i < num.length; i++) { 
        total+=num[i];
    }
    return total/num.length;
}

0

ось ваш один лайнер:

var average = arr.reduce((sum,item,index,arr)=>index !== arr.length-1?sum+item:sum+item/arr.length,0)

0

Я думаю, що це може бути прямим рішенням для обчислення середнього значення з циклом for та функцією.

var elmts = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];

function average(arr) {
    var total = 0;
    for (var i = 0; i < arr.length; i++) {
        total += arr[i];
    }
        console.log(Math.round(total/arr.length));
}

average(elmts);

0

Здається, для цього існує нескінченна кількість рішень, але я вважаю це стислим та елегантним.

const numbers = [1,2,3,4];
const count = numbers.length;
const reducer = (adder, value) => (adder + value);
const average = numbers.map(x => x/count).reduce(reducer);
console.log(average); // 2.5

Або більш сумлінно:

const numbers = [1,2,3,4];
const average = numbers.map(x => x/numbers.length).reduce((adder, value) => (adder + value));
console.log(average); // 2.5

Залежно від вашого веб-переглядача, вам може знадобитися робити явні виклики функцій, оскільки функції стрілок не підтримуються:

const r = function (adder, value) {
        return adder + value;
};
const m = function (x) {
        return x/count;
};
const average = numbers.map(m).reduce(r);
console.log(average); // 2.5

Або:

const average1 = numbers
    .map(function (x) {
        return x/count;
     })
    .reduce(function (adder, value) {
        return adder + value;
});
console.log(average1);

Ви робите N поділів у функції карти. Краще спочатку зменшити всі числа до загального значення, а потім зробити лише один поділ
Євгеніо

0

Якщо вам потрібна середня величина і ви можете пропустити вимогу обчислення суми, ви можете обчислити середнє значення за допомогою одного виклику зменшення:

// Assumes an array with only values that can be parsed to a Float
var reducer = function(cumulativeAverage, currentValue, currentIndex) {
  // 1. multiply average by currentIndex to find cumulative sum of previous elements
  // 2. add currentValue to get cumulative sum, including current element
  // 3. divide by total number of elements, including current element (zero-based index + 1)
  return (cumulativeAverage * currentIndex + parseFloat(currentValue))/(currentIndex + 1)
}
console.log([1, 2, 3, 4, 5, 6, 7, 8, 9, 10].reduce(reducer, 0)); // => 5.5
console.log([].reduce(reducer, 0)); // => 0
console.log([0].reduce(reducer, 0)); // => 0
console.log([].reduce(reducer, 0)); // => 0
console.log([,,,].reduce(reducer, 0)); // => 0
console.log([].reduce(reducer, 0)); // => 0

0

Якщо комусь це колись потрібно - Ось рекурсивна середня величина.

У контексті початкового запитання ви можете скористатися рекурсивним середнім, якщо ви дозволили користувачеві вставити додаткові значення і, не несучи знову витрат на відвідування кожного елемента, хотіли "оновити" наявне середнє значення.

/**
 * Computes the recursive average of an indefinite set
 * @param {Iterable<number>} set iterable sequence to average
 * @param {number} initAvg initial average value
 * @param {number} initCount initial average count
 */
function average(set, initAvg, initCount) {
  if (!set || !set[Symbol.iterator])
    throw Error("must pass an iterable sequence");

  let avg = initAvg || 0;
  let avgCnt = initCount || 0;
  for (let x of set) {
    avgCnt += 1;
    avg = avg * ((avgCnt - 1) / avgCnt) + x / avgCnt;
  }
  return avg; // or {avg: avg, count: avgCnt};
}

average([2, 4, 6]);    //returns 4
average([4, 6], 2, 1); //returns 4
average([6], 3, 2);    //returns 4
average({
  *[Symbol.iterator]() {
    yield 2; yield 4; yield 6;
  }
});                    //returns 4

Як:

це працює, підтримуючи поточне середнє значення та кількість елементів. Коли потрібно включити нове значення, ви збільшуєте кількість приростів на 1, масштабуйте наявне середнє значення (count-1) / countта додайтеnewValue / count до середнього.

Переваги:

  • ви не підсумовуєте всі елементи, що може призвести до великої кількості, яка не може бути збережена в 64-бітному плаву.
  • ви можете "оновити" наявне середнє значення, якщо з'являться додаткові значення.
  • можна виконати ковзаюче середнє значення, не знаючи довжини послідовності.

Недоліки:

  • понесе набагато більше підрозділів
  • не нескінченно - обмежено числом.MAX_SAFE_INTEGER елементів, якщо ви не працюєте BigNumber

-1

Середнє значення вмісту HTML відзначається

За допомогою jQuery або Javascript querySelectorви маєте прямий доступ до форматованих даних ... Приклад:

<p>Elements for an average: <span class="m">2</span>, <span class="m">4</span>,
   <span class="m">2</span>, <span class="m">3</span>.
</p>

Отже, з jQuery у вас є

var A = $('.m')
  .map(function(idx) { return  parseInt($(this).html()) })
  .get();
var AVG = A.reduce(function(a,b){return a+b}) / A5.length;

Перегляньте інші 4 способи (!), Щоб отримати доступ до нього та оцінити його середнє: http://jsfiddle.net/4fLWB/


2
Зниження, тому що ОП попросив зробити X, і ви сказали йому, як це зробити Y, то X. Крім того, ідея витягувати дані з DOM, а не створювати DOM з даних, схоже на те, чого ви, ймовірно, хочете уникнути.
eremzeit

Привіт @eremzeit, дякую увагу. Я використовую сміливий заголовок, щоб сказати "це інший випадок, із вмістом у HTML", будь ласка, врахуйте це ... Щодо релевантності, такий спосіб використання (прямий доступ до даних з HTML, який бачать користувачі) не є академічною грою ... Йдеться про "правдиву правду", тобто в HTML (!), А не на "прихованому від людей" під JavaScript ... Не тільки у Вікіпедії, дивіться типові випадки: 3,7 мільйона наукових статей в PMC , 6,6 мільйонів законодавчих документів на LexML . Деякі не займаються лише дизайном та іграми з js, роблять інструменти для аудиту.
Пітер Краус

-1

var arr = [1,2,3,4,5]

function avg(arr){
  var sum = 0;
  for (var i = 0; i < arr.length; i++) {
    sum += parseFloat(arr[i])
  }
  return sum / i;
}

avg (arr) ====== >>>> 3

Це працює з рядками як числа або числа в масиві.


Деякі пояснення вашої відповіді в порядку.
Девід Хольцер

Ви маєте рацію: визначте суму як число, так що це працює зараз. Подайте функцію масиву, і він випльовує середнє значення масиву.
дан чау

-2
    var scores =[90, 98, 89, 100, 100, 86, 94];
        var sum = 0;
        var avg = 0;
        for(var i = 0; i < scores.length;i++){
  //Taking sum of all the arraylist
            sum = sum + scores[i];   
                }
  //Taking average     
             avg = sum/scores.length;        
  //this is the function to round a decimal no    
             var round = avg.toFixed();
             console.log(round);

1
Ласкаво просимо до переповнення стека. Ваша відповідь повинна детально пояснити, чому і як вона відповідає на питання. Хоча фрагменти коду рекомендуються, ви повинні пояснити код, щоб відвідувачі могли його зрозуміти. Тут є спосіб відповіді керівництва: stackoverflow.com/help/how-to-answer
мироваріння

-3

Я б рекомендував D3 в цьому випадку. Це найчитабельніший (і пропонує 2 різних типи середніх показників)

let d3 = require('d3');
let array = [1,2,3,4];
let sum = d3.sum(array); //10
let mean = d3.mean(array); //2.5
let median = d3.median(array); 

4
Gosh додавати весь D3 лише для того, щоб розробити середній - смішно
gotofritz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.