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