JavaScript一个函数式编程-------求标准差
2024-10-09 16:49:59
利用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);
最新文章
- jQuery 遍历函数
- 基于.NET的CAD二次开发学习笔记一:CAD开发入门
- Infinispan 8 中新的 Redis 缓存存储实现
- iOS边练边学--父子控制器之自定义控制器的切换
- web app
- 当PHP引擎试图实例化一个未知类的操作
- Python For Data Analysis -- NumPy
- 转载 近期微博吐槽言论存档,涉及“性能优化”、C++陋习等
- ems lite 客户端远程连接mysql server
- K - Candies(最短路+差分约束)
- VS2010调试小技巧
- apache服务器参数设置
- Discuz!X2.5论坛在IIS和Apache环境配置实现伪静态
- logback:用slf4j+logback实现多功能日志解决方案
- Linux显示用户的ID
- CDN的基本工作过程
- 腾讯地图打开地图选取位置 withMap
- Solr中使用游标进行深度分页查询以提高效率(适用的场景下)
- spring boot (二):使用fastJson解析json数据
- Linux内核学习笔记之seq_file接口创建可读写proc文件
热门文章
- Java ClassLoader 原理分析
- hadoop2.7.2单机与伪分布式安装
- python unittest 测试笔记(一)
- 记一次利用AutoMapper优化项目中数据层到业务层的数据传递过程。
- css颜色值设置方式有哪些?以及如何随机一个颜色?
- 基于angular实现模拟微信小程序swiper组件
- javaCV开发详解之技术杂烩:javaCV能帮我们做什么?能实现什么功能?ffmpeg和openCV能实现功能,javaCV如何做到更快、更简单的实现相应的功能?等等一堆实用话题
- TeamViewer——可以实现在手机上随时远程控制你的电脑
- js获取页面宽高
- 标准IO和重定向