可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
This question already has answers here:
Closed 2 years ago.
I've been looking and haven't found a simple question and answer on stack overflow looking into finding the average of an array.
This is the array that I have
var grades = [80, 77, 88, 95, 68];
I first thought that the answer to this problem would be something like this:
var avg = (grades / grades.length) * grades.length
console.log(avg)
However this gave me an output of NaN.
So then I tried this:
for ( var i = 0; i < grades.length; i ++){
var avg = (grades[i] / grades.length) * grades.length
}
console.log(avg)
This gave me an output of 68. (I'm not sure why).
So with this I have two questions. 1. Why was my output 68? and 2. Could somebody help me out with actually finding the average of an array?
回答1:
You calculate an average by adding all the elements and then dividing by the number of elements.
var total = 0;
for(var i = 0; i < grades.length; i++) {
total += grades[i];
}
var avg = total / grades.length;
The reason you got 68 as your result is because in your loop, you keep overwriting your average, so the final value will be the result of your last calculation. And your division and multiplication by grades.length cancel each other out.
Update: added ;
in last line of code example to avoid error.
回答2:
For the second part of your question you can use reduce
to good effect here:
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);
The other answers have given good insight into why you got 68, so I won't repeat it here.
回答3:
With ES6 you can turn Andy's solution into as a one-liner:
let average = (array) => array.reduce((a, b) => a + b) / array.length;
console.log(average([1,2,3,4,5]));
回答4:
One liner challange accepted
const average = arr => arr.reduce((sume, el) => sume + el, 0) / arr.length;
and then
average([1,2,3,4]); // 2.5
回答5:
The MacGyver way,just for lulz
var a = [80, 77, 88, 95, 68];
console.log(eval(a.join('+'))/a.length)
回答6:
There's no built in function, but you can use this to get the sum,
Array.prototype.sum = function() {
return this.reduce(function(a,b){return a+b;});
};
then divide by the arrays length, e.g.:
var arr = [1,2,3,4,5]
console.log(arr.sum() / arr.length)
回答7:
It can simply be done with a single reduce operation as follows;
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:
You can use map/reduce functions of javascript to find average. Reduce will sum them up, and map will find average.
var avg = grades.map((c, i, arr) => c / arr.length).reduce((p, c) => c + p);
回答10:
The average function you can do is:
const getAverage = (arr) => arr.reduce((p, c) => p + c, 0) / arr.length
Also, I suggest that use the popoular open source tool, eg. Lodash
:
const _ = require('lodash')
const getAverage = (arr) => _.chain(arr)
.sum()
.divide(arr.length)
.round(1)
.value()
回答11:
answer to your 1. question:
for ( var i = 0; i < grades.length; i ++){
var avg = (grades[i] / grades.length) * grades.length
}
avg
is declared in each loop.
Thus, at the end of the loop, avg
has the value of the last item in the array : 68 *5 / 5
回答12:
Writing the function for average yourself is crazy. That's why modules exist. I found math.js
In my HTML file:
<script src="http://cdnjs.cloudflare.com/ajax/libs/mathjs/3.2.1/math.min.js"></script>
(or you can download it)
In my JS code:
math.mean([1,2,3]) // =2
math.mean(1,2,3) // the same
math.mean(grades)