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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM