JavaScript一个函数式编程-------求标准差
利用JavaScript中的map函数和reduce函数实现函数式编程。
注意:
输出都在浏览器的控制台中。
代码如下:
<script type="text/javascript"> //定义两个简单的函数 var sum = function(x,y){ return x+y;}; //求和函数 var square = function(x){ return x*x;}; //数组中每个元素求它的平方 var data = [1,1,3,5,5]; // var mean = data.reduce(sum)/data.length; var deviations = data.map(function(x){return x-mean;}); var stddev = Math.sqrt(deviations.map(square).reduce(sum)/(data.length-1));
console.log("平均值:"+mean); console.log("偏差:"+deviations); console.log("标准差:"+stddev); </script>
说明:
data是一个数组对象,data.reduce(function)方法带一个函数做参数,可把data中的所有元素都累加,返回累加和。
注意:
做参数的函数需要带两个参数
上面的data.reduae()相当于:
var sum=0; for(var i=0 ; i<data.length; i++) sum+=data[i];
data.map()可将data数组中的每个元素经过function的处理,返回一个执行function后的新数组,本例返回数组:[1,1,9,25,25]
Math.sqrt(deviations.map(square).reduce(sum)/(data.length-1));
这个语句使用了链,因为 deviations.map(square)返回了一个数组对象,所以可以接着使用数组对象里的方法reduce(sum)继续调用。
二、用自定义的map()和reduce()实现data.map()和data.reduce()方法
//如果Array.prototype.map定义了的话,就使用这个方法 var map = /*Array.prototype.map ? function(a,f){ return a.map(f);} :*/function(a,f){ var results=[]; for(var i=0 ,len=a.length ; i<len ; i++) if( i in a) results[i] = f.call(null,a[i]); return results; }; //使用函数f()和可选的初始值将数组a减至一个值 //如果Array.prototype.reduce存在的话,就是用这个方法 var reduce = /*Array.prototype.reduce ? function(a,f,initia){ //initia为设置累加的初始值 if(arguments.length > 2) //传过来的实参在arguments中会存有一份,词语句用于判断是否传了initia参数 return a.reduce(f,initia); else return a.reduce(f); //没有传initia的值 } : */function(a,f,initia){ var i=0,len = a.length,accumulator; //以特定的初始值开始,否则第一值取自a if( arguments.length > 2) accumulator = initia; else{ //找到数组中第一已定义的索引 if( len == 0) throw TypeError(); while( i < len){ if( i in a){ accumulator = a[i++]; break; }else i++; } if( i == len) throw TypeError(); } //对于数组中剩下的元素一次调用飞f() while( i < len ){ if( i in a) accumulator = f.call(undefined,accumulator,a[i]);//每次把最新求到的值传过与a[i]累加 i++; } return accumulator; } var data = [1,1,3,5,5]; var sum = function(x,y){ return x+y;}; var square = function(x){ return x*x;}; var mean = reduce(data,sum)/data.length; var deviations = map(data,function(x){ return x-mean;}); var stddev = Math.sqrt(reduce(map(deviations,square),sum)/(data.length-1)); console.log("用自定义函数计算得到:"); console.log("平均值:"+mean); console.log("偏差:"+deviations); console.log("标准差:"+stddev);