Bagaimana cara menghitung jumlah dan rata-rata elemen dalam array?

177

Saya mengalami masalah dalam menambahkan semua elemen array serta rata-rata keluar. Bagaimana saya melakukan ini dan menerapkannya dengan kode yang saya miliki saat ini? Elemen seharusnya didefinisikan seperti yang saya miliki di bawah ini.

<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>
jonathan miller
sumber
26
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]akan jauh lebih baik.
James McLaughlin

Jawaban:

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 );

Hanya beralih melalui array, karena nilai Anda adalah string, mereka harus dikonversi ke integer terlebih dahulu. Dan rata-rata hanyalah jumlah nilai yang dibagi dengan jumlah nilai.

Marcus Recck
sumber
13
Satu-satunya perbaikan yang akan saya lakukan adalah mengganti for(var i = 0; i < elmt.length; i++;)denganfor(var i = 0, l = elmt.length; i < l; i++)
Dan D.
5
bukan untuk menjadi orang itu atau untuk keluar topik tapi itu praktik yang baik untuk memasukkan argumen radix di parseInt (). Maksud saya sum += parseInt(elmt[i], 10);mengasumsikan elmt [i] adalah dari basis 10. tautan
Ryder Brooks
9
Hati-hati dengan pembagian oleh 0 (elmt.length mungkin saya 0)
caulitomaz
2
@BramVanroy Cerpen: Tidak, ini tidak mengatur 'l' setiap saat. Panjang cerita: Solusi DanD adalah untuk meningkatkan kinerja / kecepatan, karena memeriksa panjang array setiap iterasi lebih lambat daripada benar-benar menyimpan panjang dalam variabel lokal dan merujuknya setiap iterasi.
CatalinBerta
9
@VitoGentile dan DanD memberikan kode untuk keuntungan kinerja yang dikompilasi oleh Peramban modern seharusnya bukan praktik terbaik.
nauti
496

Solusi yang saya anggap lebih elegan:

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}.`);
Sergi Mansilla
sumber
1
Ini tidak akan berfungsi pada <= IE8, karena tidak mendukung Array.prototype.reduce () Lihat lebih lanjut di developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
aabele
14
dengan rata-rata bergerak kumulatif, Anda bisa melakukan ini semua dalam fungsi pengurangan (tidak perlu untuk sum/times.lengthlangkah ini):var avg = times.reduce(function(p,c,i){return p+(c-p)/(i+1)},0);
zamnuts
6
@zamnuts saya bersamamu, saya pikir komentar Thor84no benar-benar rusak - saya akan senang dipecat dari tempat yang menemukan array. mengurangi terlalu kompleks. Namun saya tidak akan menggunakan kode Anda juga, untuk fakta sederhana itu memiliki divisi dan dua tambahan tambahan pada langkah yang pernah, yang tidak akan pernah seefisien satu divisi pada akhirnya
gotofritz
12
Di ES2015 itu sedikit lebih elegan. times.reduce((a,b) => (a+b)) / times.length;
Ray Foss
12
@furf 5 tahun kemudian, sepertinya di banyak browser modern, "pengurangan ()" yang lebih elegan lebih cepat (atau lebih cepat). Di Chrome 65 dan sebagian besar pengurangan firefox lebih baik pada pengujian itu.
Sir Robert
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);

Abdennour TOUMI
sumber
3
Peningkatan: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; };
Gilad Peleg
42
Tolong, jangan memperluas objek yang tidak dibuat oleh kode Anda.
Brad
1
UPDATE tidak berfungsi untuk: ["RER", "4", "3re", 5, Object ()]. ​​Rata-rata (); mengembalikan 0 bukannya yang diharapkan 4.5
Luckylooke
4
Dan ini akan sangat parah ketika tidak ada panjang
Jimmy Kane
2
@ JimmyKane Tidak, itu akan kembali NaN.
bzeaman
37

Menghitung rata-rata (rata-rata) menggunakan pengurangan dan ES6:

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

const list = [0, 10, 20, 30]
average(list) // 15
Tomasz Mularczyk
sumber
sangat sangat lambat dibandingkan dengan penambahan sederhana berbasis loop dengan variabel jumlah jsben.ch/0xUus
PirateApp
Ini perbedaan 25%. Tidak terlalu buruk, saya pikir.
Michael
20

umumnya rata-rata menggunakan pengurangan satu-liner adalah seperti ini

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

khusus untuk pertanyaan yang diajukan

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

versi yang efisien seperti

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

Memahami Mengurangi Array Javascript dalam 1 Menit http://www.airpair.com/javascript/javascript-array-reduce

seperti yang ditunjukkan oleh Gotofritz tampaknya Array.reduce melewatkan nilai yang tidak ditentukan. jadi di sini adalah perbaikannya:

(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])
Shimon Doodkin
sumber
2
elements.length!=0?elements.length:1 dapat juga ditulis seperti ini: elements.length || 1 yang lebih pendek, dan lebih mudah dibaca.
4rzael
2
Ingatlah ini hanya berfungsi untuk array tanpa celah kosong
gotofritz
1
Saran: Tambahkan versi cuplikan kode Anda yang tidak diubah (sebenarnya hanya tercetak cukup) agar orang dapat membacanya. Saya akan mengeditnya sendiri, tetapi saya tidak suka mengubah jawaban orang sejauh itu.
Justin Morgan
16

Bayangkan kita memiliki array bilangan bulat seperti ini:

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

Rata-rata diperoleh dengan rumus berikut

A = (1 / n) Σxi (dengan i = 1 ke n) ... Jadi: x1 / n + x2 / n + ... ... xn / n

Kami membagi nilai saat ini dengan jumlah nilai dan menambahkan hasil sebelumnya ke nilai yang dikembalikan.

Tanda tangan metode pengurangan adalah

reduce(callback[,default_previous_value])

Fungsi mengurangi panggilan balik mengambil parameter berikut:

  • p : Hasil perhitungan sebelumnya
  • c : Nilai saat ini (dari indeks saat ini)
  • i : Nilai indeks elemen array saat ini
  • a : Array berkurang saat ini

Parameter reduksi kedua adalah nilai default ... (Digunakan jika array kosong ).

Jadi metode pengurangan rata-rata adalah:

var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);

Jika mau, Anda dapat membuat fungsi terpisah

function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};

Dan kemudian cukup merujuk ke tanda tangan metode panggilan balik

var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);

Atau menambah prototipe Array secara langsung ..

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

Dimungkinkan untuk membagi nilai setiap kali metode pengurangan dipanggil ..

Array.prototype.avg = Array.prototype.avg || function () {
  return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};

Atau bahkan lebih baik , menggunakan Array.protoype.sum () yang didefinisikan sebelumnya

metode, mengoptimalkan proses saya memanggil divisi hanya sekali :)

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

Kemudian pada objek array apa pun dari ruang lingkup:

[2, 6].avg();// -> 4
[2, 6].sum();// -> 8

NB: array kosong dengan mengembalikan harapan NaN lebih benar daripada 0 dalam sudut pandang saya dan dapat berguna dalam kasus penggunaan tertentu.

Ludovic Frérot
sumber
13

Anda juga dapat menggunakan lodash , _.sum (array) dan _.mean (array) di bagian Math (juga memiliki hal-hal praktis lainnya).

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

Bukan yang tercepat, tetapi yang terpendek dan dalam satu baris menggunakan map () & kurangi ():

var average = [7,14,21].map(function(x,i,arr){return x/arr.length}).reduce(function(a,b){return a + b})
Johann Echavarria
sumber
1
mungkin lebih pendek [7,14,21].reduce((avg,e,i,arr)=>avg+e/arr.length,0);tetapi dengan perilaku berbeda pada array kosong. Jika Anda ingin hasilnya kosong pada array kosong:[].reduce((a,e,i,arr)=>(a?a:0)+e/arr.length,"")
Valen
@Tobiq map & pengurangan cukup standar sejak ES5 (standar pada 2009)
Johann Echavarria
for (var avg = 0, length = i = arr.length; i--;) avg += arr[i] / lengthJauh lebih jelas, lebih pendek dan lebih cepat
Tobiq
2
@Tobiq, kode Anda tidak jelas. Sekilas jenis loop ini tidak dapat dipahami.
Porkopek
5

Salah satu cara licik Anda bisa melakukannya walaupun memang membutuhkan penggunaan (yang paling dibenci) 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/>");

Hanya berpikir saya akan memposting ini sebagai salah satu opsi 'di luar kotak'. Anda tidak pernah tahu, kecerdikan mungkin memberi Anda (atau menghilangkan) satu poin.

Phil Cooper
sumber
+1 Satu liner yang efisien dan bagus! Jika itu adalah Javascript sisi-browser di sisi klien, satu-satunya eval()masalah yang mungkin saya lihat adalah Anda perlu memastikan array berisi angka saja (yang tentu saja juga berlaku untuk semua jawaban lain di sini). Entri non-numerik macet dengan ReferenceErroratau SyntaxError, except nested arrays of numbers which introduce , `menyebabkan total numerik salah. Dan tentu saja di sisi server JS, misalnya node.js, maka secara alami eval()mungkin memperkenalkan masalah keamanan. Tapi ini terlihat sempurna untuk penggunaan sisi klien yang terstruktur dengan baik.
user56reinstatemonica8
1
Sebenarnya mungkin ada masalah kinerja termasuk eval()seperti ini - lihat bagian kinerja nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood
user56reinstatemonica8
5

Saya menggunakan metode ini di perpustakaan pribadi saya:

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: Untuk menggunakannya, cukup tanyakan jumlah atau rata-rata array, seperti:

[1,2,3].sum() // = 6
[1,2,3].average() // = 2
Keith
sumber
Implementasi yang rapi walaupun saya akan menerapkan jumlah untuk menggunakan for for alih-alih mengurangi. Masih kode sangat bersih.
XDS
5

Di browser ES6-ready , polyfill ini mungkin bisa membantu.

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

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

Anda dapat berbagi metode panggilan yang sama antara Math.sum, Math.avg dan Math.max, seperti

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

Anda dapat menggunakan Math.sum sebagai

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

atau jika Anda memiliki array untuk diringkas, Anda dapat menggunakan

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

seperti

var maxOne = Math.max.apply(null,[1,2,3,4]) // 4
Oboo Cheng
sumber
Alih-alih menambahkan metode Array.prototype, saya pikir menambahkan tema ke Mathobjek adalah pilihan yang lebih baik - mereka semua "penangan angka".
Oboo Cheng
3

Berikut ini adalah tambahan cepat ke objek "Math" di javascript untuk menambahkan perintah "rata-rata" ke dalamnya !!

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;
}

Maka saya memiliki tambahan ini ke objek "Matematika" untuk mendapatkan jumlah!

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;
}

Jadi semua yang Anda lakukan adalah

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

Dan di mana saya meletakkan array placeholder hanya lewat di variabel Anda (Input jika mereka angka bisa menjadi string karena itu parsing ke angka!)

Jacob Morris
sumber
1

atur loop counter Anda ke 0 .... Anda mendapatkan elemen 9 dan kemudian selesai seperti sekarang. Jawaban lainnya adalah matematika dasar. Gunakan variabel untuk menyimpan jumlah Anda (perlu memberikan string ke ints), dan bagi dengan panjang array Anda.

Volvox
sumber
1

Mulailah dengan mendefinisikan semua variabel yang kami rencanakan untuk digunakan. Anda akan mencatat bahwa untuk numbersarray, saya menggunakan notasi literal yang []bertentangan dengan metode konstruktor array(). Selain itu, saya menggunakan metode yang lebih pendek untuk mengatur beberapa variabel menjadi 0.

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

Selanjutnya saya mengisi array angka kosong saya dengan nilai 0 hingga 11. Ini untuk membawa saya ke titik awal semula. Perhatikan bagaimana saya mendorong ke array count++. Ini mendorong nilai hitungan saat ini, dan kemudian meningkatkannya untuk waktu berikutnya.

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

Terakhir, saya melakukan fungsi "untuk masing-masing" angka dalam array angka. Fungsi ini akan menangani satu angka pada satu waktu, yang saya identifikasi sebagai "n" di dalam tubuh fungsi.

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

Pada akhirnya, kita bisa menampilkan sumnilai, dan avgnilai ke konsol kita untuk melihat hasilnya:

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

Lihat beraksi online di http://jsbin.com/unukoj/3/edit

Sampson
sumber
1

Saya hanya membangun jawaban Abdennour TOUMI. berikut alasannya:

1.) Saya setuju dengan Brad, saya pikir itu bukan ide yang bagus untuk memperluas objek yang tidak kita buat.

2.) array.lengthtepat dapat diandalkan dalam javascript, saya lebih suka Array.reducekarena a=[1,3];a[1000]=5;sekarang a.lengthakan kembali 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; 
};
mido
sumber
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 ) ; 
};

Kemudian :

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

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

Pada browser evergreen Anda dapat menggunakan fungsi panah avg = [1,2,3].reduce((a,b) => (a+b);

Menjalankannya 100.000 kali, perbedaan waktu antara pendekatan for loop dan reduksi diabaikan.

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.
 */

Ray Foss
sumber
1
Anda perlu mempelajari lebih lanjut tentang console.time&console.timeEnd
Abdennour TOUMI
@AbdennourTOUMI Terima kasih atas tipnya, saya akan mengingatnya ... namun ini bukan standar dan tidak sesuai standar. developer.mozilla.org/en-US/docs/Web/API/Console/timeEnd
Ray Foss
1
Saya tahu saya menyimpang dari pertanyaan awal tetapi bagaimana dengan menggunakan performance.now () untuk pengukuran kinerja?
deejbee
@deejbee Itu memang menawarkan akurasi floating point ... tetapi juga sedikit lebih verbose dan kurang kompatibel. Mengatur spidol dengan itu akan berguna dalam kode dunia nyata
Ray Foss
1

Average One Liner Terpendek:

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

Jumlah Terpendek Satu Liner:

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

Hanya untuk iseng:

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)));

sumber
0

Saya pikir kita bisa melakukannya

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

Saya menggunakan parseFloat dua kali karena ketika 1) Anda menambahkan (a) angka 9 + b ("1") maka hasilnya adalah "91" tetapi kami ingin penambahan. jadi saya menggunakan parseFloat

2) Ketika penambahan (a) 9 + parseFloat ("1") terjadi meskipun hasilnya akan "10" tetapi itu akan menjadi string yang tidak kita inginkan jadi saya menggunakan parseFloat lagi.

Saya harap saya jelas. Saran diterima

Roli Agrawal
sumber
0

Inilah cara pemula saya hanya menemukan rata-rata. Semoga ini bisa membantu seseorang.

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

inilah satu liner Anda:

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

Saya pikir ini mungkin solusi langsung untuk menghitung rata-rata dengan for for loop dan function.

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);
redcoder
sumber
0

Tampaknya ada banyak solusi untuk ini, tetapi saya menemukan ini ringkas dan elegan.

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

Atau lebih tepatnya:

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

Bergantung pada browser Anda, Anda mungkin perlu melakukan panggilan fungsi eksplisit karena fungsi panah tidak didukung:

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

Atau:

const average1 = numbers
    .map(function (x) {
        return x/count;
     })
    .reduce(function (adder, value) {
        return adder + value;
});
console.log(average1);
Charles Owen
sumber
Anda membuat divisi N dalam fungsi peta. Lebih baik mengurangi semua angka menjadi nilai total dan kemudian hanya membuat satu divisi
Eugenio
0

Jika Anda membutuhkan rata-rata dan dapat melewati persyaratan penghitungan jumlah, Anda dapat menghitung rata-rata dengan satu panggilan pengurangan:

// 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
sealocal
sumber
0

Jika ada yang membutuhkannya - Ini adalah rata-rata rekursif.

Dalam konteks pertanyaan awal, Anda mungkin ingin menggunakan rata-rata rekursif jika Anda mengizinkan pengguna untuk memasukkan nilai-nilai tambahan dan, tanpa menimbulkan biaya mengunjungi setiap elemen lagi, ingin "memperbarui" rata-rata yang ada.

/**
 * 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

Bagaimana:

ini berfungsi dengan mempertahankan rata-rata dan jumlah elemen saat ini. Ketika nilai baru akan dimasukkan, Anda menambah hitungan dengan 1, skala rata-rata yang ada oleh (count-1) / count, dan tambahkannewValue / count rata-rata.

Manfaat:

  • Anda tidak menjumlahkan semua elemen, yang dapat menghasilkan sejumlah besar yang tidak dapat disimpan dalam float 64-bit.
  • Anda dapat "memperbarui" rata-rata yang ada jika nilai tambahan tersedia.
  • Anda dapat melakukan rolling average tanpa mengetahui panjang urutannya.

Kerugian:

  • menimbulkan lebih banyak divisi
  • tidak terbatas - terbatas pada Number.MAX_SAFE_INTEGER item kecuali Anda mempekerjakan BigNumber
Meirion Hughes
sumber
-1

Rata-rata konten HTML itens

Dengan jQuery atau Javascript, querySelectorAnda memiliki akses langsung ke data yang diformat ... Contoh:

<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>

Jadi, dengan jQuery yang Anda miliki

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

Lihat 4 cara (!) Lainnya untuk mengakses itens dan rata-rata: http://jsfiddle.net/4fLWB/

Peter Krauss
sumber
2
Mengundurkan diri karena OP meminta untuk melakukan X dan Anda mengatakan kepadanya bagaimana melakukan Y lalu X. Juga, gagasan untuk menarik data dari DOM daripada membuat DOM dari data sepertinya adalah sesuatu yang Anda mungkin ingin hindari.
eremzeit
Hai @ eremzeit, terima kasih perhatian. Saya menggunakan judul tebal untuk mengatakan "ini kasus lain, dengan konten ke dalam HTML", harap pertimbangkan ... Tentang relevansi, penggunaan semacam ini (akses langsung data dari HTML yang dilihat pengguna) bukan permainan akademis ... Ini tentang "kebenaran yang dapat diaudit", yaitu ke dalam HTML (!), Bukan "disembunyikan dari manusia" di javascript ... Tidak hanya di Wikipedia, lihat kasus-kasus tertentu: 3,7 juta artikel ilmiah di PMC , 6,6 JUTA dokumen legislatif di LexML . Beberapa orang tidak hanya melakukan desain dan permainan dengan js, melakukan alat untuk audit.
Peter Krauss
-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;
}

rata-rata (arr) ====== >>>> 3

Ini berfungsi dengan string sebagai angka atau angka dalam array.

dan chow
sumber
Ada beberapa penjelasan untuk jawaban Anda.
David Hoelzer
Anda benar: jumlah yang didefinisikan sebagai angka sehingga ini berfungsi sekarang. Feed fungsi array dan itu memuntahkan rata-rata array.
dan chow
-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);
Hannan Saleem
sumber
1
Selamat datang di Stack Overflow. Jawaban Anda harus menjelaskan secara terperinci mengapa dan bagaimana jawaban itu menjawab pertanyaan. Sementara cuplikan kode disarankan, Anda harus menjelaskan kode sehingga pengunjung dapat memahaminya. Ada panduan cara menjawab di sini: stackoverflow.com/help/how-to-answer
ChrisM
-3

Saya akan merekomendasikan D3 dalam hal ini. Ini adalah yang paling mudah dibaca (dan menyediakan 2 jenis rata-rata)

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); 
Pembisik kode
sumber
4
Astaga menambahkan seluruh D3 hanya untuk berolahraga rata-rata konyol
gotofritz