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

最新文章

  1. jQuery 遍历函数
  2. 基于.NET的CAD二次开发学习笔记一:CAD开发入门
  3. Infinispan 8 中新的 Redis 缓存存储实现
  4. iOS边练边学--父子控制器之自定义控制器的切换
  5. web app
  6. 当PHP引擎试图实例化一个未知类的操作
  7. Python For Data Analysis -- NumPy
  8. 转载 近期微博吐槽言论存档,涉及“性能优化”、C++陋习等
  9. ems lite 客户端远程连接mysql server
  10. K - Candies(最短路+差分约束)
  11. VS2010调试小技巧
  12. apache服务器参数设置
  13. Discuz!X2.5论坛在IIS和Apache环境配置实现伪静态
  14. logback:用slf4j+logback实现多功能日志解决方案
  15. Linux显示用户的ID
  16. CDN的基本工作过程
  17. 腾讯地图打开地图选取位置 withMap
  18. Solr中使用游标进行深度分页查询以提高效率(适用的场景下)
  19. spring boot (二):使用fastJson解析json数据
  20. Linux内核学习笔记之seq_file接口创建可读写proc文件

热门文章

  1. Java ClassLoader 原理分析
  2. hadoop2.7.2单机与伪分布式安装
  3. python unittest 测试笔记(一)
  4. 记一次利用AutoMapper优化项目中数据层到业务层的数据传递过程。
  5. css颜色值设置方式有哪些?以及如何随机一个颜色?
  6. 基于angular实现模拟微信小程序swiper组件
  7. javaCV开发详解之技术杂烩:javaCV能帮我们做什么?能实现什么功能?ffmpeg和openCV能实现功能,javaCV如何做到更快、更简单的实现相应的功能?等等一堆实用话题
  8. TeamViewer——可以实现在手机上随时远程控制你的电脑
  9. js获取页面宽高
  10. 标准IO和重定向