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

 

posted @ 2017-05-27 10:29  newAdmin  阅读(5237)  评论(2编辑  收藏  举报