zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    英语cabardine麝香cabardine单词
    英语dialogite红纹石dialogite菱锰矿
    英语chiltonite葡萄石chiltonite单词
    英语chrysopal金绿宝石chrysopal单词
    Android系统默认对话框添加图片
    入门rocketmq从浅到深
    通用mapper认识和用法
    java开发注解大全
    solr的认识、linux下安装、java下使用(含下载资源)
    RSA签名和验签Util
  • 原文地址:https://www.cnblogs.com/ctsch/p/6911759.html
Copyright © 2011-2022 走看看