数组总和和平均值

我有问题添加一个数组的所有元素,以及平均他们。 我将如何做到这一点,并用我现在的代码来实现呢? 元素应该被定义为我在下面。

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

只需遍历数组,因为你的值是string,他们必须首先转换为整数。 平均值只是值的总和除以值的数量。

我认为更优雅的解决scheme:

 var sum = times.reduce(function(a, b) { return a + b; }); var avg = sum / times.length; document.write("The sum is: " + sum + ". The average is: " + avg + "<br/>"); 

一般平均使用单线减less就是这样

 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数组减less1分钟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]) 

ES6

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

让我们想象我们有这样一个整数数组:

 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

我们将当前值除以值的数量并将以前的结果添加到返回的值。

减less方法签名是

 reduce(callback[,default_previous_value]) 

reducecallback函数采用以下参数:

  • p :以前的计算结果
  • c :当前值(来自当前索引)
  • i :当前数组元素的索引值
  • a :当前减less的数组

第二个reduce的参数是默认值 …(在数组为空的情况下使用)。

所以平均减less的方法是:

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

如果你喜欢,你可以创build一个单独的function

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

然后简单地引用callback方法签名

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

每次调用reduce方法都可以分割值。

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

然后在该作用域的任何Array对象上:

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

注意:返回一个NaN wish的空数组在我的观点上比0更正确,在特定的用例中可能是有用的。

不是最快的,但最短的一行是使用map()&reduce():

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

一个鬼鬼祟祟的方式,你可以做到这一点,虽然它需要使用(很讨厌)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/>"); 

只是觉得我会把这张贴作为“盒子外”选项之一。 你永远不知道,狡猾可能会授予你(或带走)一个点。

我在我的个人图书馆中使用这些方法:

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

编辑:要使用它们,只需要问数组的总和或平均值,如:

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

ES6就绪的浏览器中,这个填充可能会有所帮助。

 Math.sum = function (...a){ return Array.prototype.reduce.call(a,(a,b) => a+b) } Math.avg = function(...a){ return this.sum(...a)/a.length; } 

您可以在Math.sumMath.avgMath.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 

首先定义我们打算使用的所有variables。 你会注意到对于数组数组,我正在使用[]的文字符号而不是构造函数方法array() 。 另外,我使用更短的方法将多个variables设置为0。

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

接下来,我使用值0到11填充空数字数组。这是让我到你的原始起点。 注意我是如何推入数组count++ 。 这推动了当前的计数值,然后在下一次增加。

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

最后,我正在为numbers数组中的每个数字执行一个函数。 这个函数一次只能处理一个数字,我在函数体内标识为“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在线查看;

我只是build立在Abdennour TOUMI的答案上。 这里是为什么:

1)我同意布拉德的看法,我认为扩展我们没有创build的对象是一个好主意。

2.) array.length在JavaScript中是完全可靠的,我更喜欢Array.reduce因为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; }; 

这是我简单find平均值的新手方法。 希望这有助于某人。

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

在常绿浏览器上,你可以使用箭头函数avg = [1,2,3].reduce((a,b) => (a+b);

运行100,000次,for循环方法和reduce之间的时间差是可以忽略的。

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

设置你的for循环计数器为0 ….你得到元素9,然后你就完成了,因为你现在。 其他答案是基本的math。 使用一个variables来存储你的总和(需要将string转换为整数),然后除以你的数组长度。

只是踢:

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

这是一个平均数组的优雅的小解决scheme,它是非常低效的,但有非常具体的应用程序:

 var average = elmt.reduce(function(x,y,z){ return ((x * z) + y) / (z + 1); }); 

文件为“减less”的方法

 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 
 protected void Submit_Click(object sender, EventArgs e) { foreach (ComputerLabReservationList row in db.ComputerLabReservationLists) { if (row.LabNo == lblLabNo.Text && row.ReservationDate == StartCld.Text && row.StartEndTime == ddlstartendtime.Text) { // string display = "This time have been reserved by others. Please reserve again."; // ClientScript.RegisterStartupScript(this.GetType(), "yourMessage", "alert('" + display + "');", true); ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('This time already booked by other. Please insert another time');window.location ='Computerlabs.aspx';", true); } else { ComputerLabReservationList crl = new ComputerLabReservationList() { ResvId = lblreservationid.Text, LabNo = lblLabNo.Text, LecturerId = lblLecturerID.Text, ReservationDate = StartCld.Text, StartEndTime = ddlstartendtime.Text }; db.ComputerLabReservationLists.InsertOnSubmit(crl); db.SubmitChanges(); ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('Your Reservation was sucessfully');window.location ='MyComputerReservation.aspx';", true); } } } 

我想我们可以这样做

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

我使用parseFloat两次,因为当1)你添加(a)9 + b(“1”)数字然后结果将是“91”,但我们希望增加。 所以我用parseFloat

2)当添加(a)9 + parseFloat(“1”)虽然结果将会是“10”,但它将会在我们不想要的string中,所以我再次使用了parseFloat。

我希望我很清楚。 欢迎提出build议

这是你的一个class轮:

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

我认为这可能是一个直接的解决scheme,用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); 

你也可以在math部分使用lodash ,_.sum(array)和_.mean(array)(也有其他方便的工作人员)。

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

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种方式(!)来访问itens和平均: http : //jsfiddle.net/4fLWB/

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

这可以在数组中使用string作为数字或数字。

我有10个元素(就像这个例子),所以我做了:

 ( elmt[0] + elmt[1] + elmt[2] + elmt[3] + elmt[4] + elmt[5] + elmt[6] + elmt[7] + elmt[8] + elmt[9] ) / 10 

简单的代码可能如下所示:

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

如果您需要浮点数的摘要,请使用parseFloat而不是parseInt

在这种情况下,我会推荐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);