2015-04-09 19 views
13

Ho cercato e non ho trovato una semplice domanda e risposta sullo stack overflow cercando di trovare la media di un array.Trovare la media di un array usando JS

Questa è la matrice che ho

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

ho pensato che la risposta a questo problema sarebbe qualcosa di simile:

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

Tuttavia, questo mi ha dato una potenza di NaN.

Allora ho provato questo:

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

questo mi ha dato una potenza di 68. (non sono sicuro perché).

Quindi con questo ho due domande. 1. Perché la mia uscita è stata 68? e 2. Qualcuno potrebbe aiutarmi a trovare effettivamente la media di un array?

risposta

23

Si calcola una media aggiungendo tutti gli elementi e quindi dividendo per il numero di elementi.

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

Il motivo che hai 68 come il vostro risultato è perché nel vostro ciclo, si continua a sovrascrivere il vostro media, quindi il valore finale sarà il risultato del tuo ultimo calcolo. E la tua divisione e moltiplicazione per gradi e lunghezza si annullano a vicenda.

Aggiornamento: aggiunto ; nell'ultimo esempio di codice per evitare errori.

16

Per la seconda parte della tua domanda è possibile utilizzare reduce con buoni risultati qui:

function getAvg(grades) { 
    return grades.reduce(function (p, c) { 
    return p + c; 
    })/grades.length; 
} 

getAvg(grades); // 81.6 

DEMO

Le altre risposte hanno dato una buona visione per cui si ha 68, quindi non mi ripetilo qui

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

Questo codice non funziona. Ad esempio, dove è usato 'gradesTotal'? – Drakes

+0

Whoops! È diventato un po 'pazzo con il backspace in precedenza;) –

0

risposta alla tua 1. domanda:

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

avg è dichiarata in ogni ciclo. Così, alla fine del ciclo, avg ha il valore dell'ultimo elemento dell'array: 68 * 5/5

6

Non c'è costruito in funzione, ma è possibile utilizzare questo per ottenere la somma,

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

poi dividere per la lunghezza array, ad esempio:

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

È possibile utilizzare la mappa/ridurre le funzioni del javascript per trovare media. La riduzione li sommerà e la mappa troverà la media.

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

Può essere eseguito semplicemente con un'operazione di riduzione singola come segue;

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

1

Creazione della funzione per la media stessi è pazzo. Ecco perché i moduli esistono. Ho trovato math.js

Nel mio file HTML:

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

(o è possibile scaricarlo)

Nel mio codice JS:

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

Includere la libreria da 1,57 MB per una semplice copertina è pazzesco – Lauri

6

Con ES6 si può trasformare la soluzione di Andy in come one-liner:

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

6

Il modo MacGyver, solo per lulz

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

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

+5

Il 'just for lulz' ti protegge dai massimi downvotes :) –

1

La funzione di media che puoi fare è:

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

Inoltre, vi suggerisco di utilizzare il strumento open source popoulare, ad es. Lodash:

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

Una sfida fodera accettati

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

e poi

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

Problemi correlati