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);
JavaScript一个函数式编程-------求标准差的更多相关文章
- 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 引言&前言
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 译者团队(排名不分先后):阿希.blueken.brucec ...
- 翻译连载 | 第 10 章:异步的函数式(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 翻译连载 | 第 10 章:异步的函数式(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 翻译连载 | 附录 A:Transducing(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 翻译连载 | 附录 A:Transducing(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 翻译连载 | 附录 B: 谦虚的 Monad-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- 翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
随机推荐
- Javascript加载执行顺序
本文主要内容 一.不同位置的script标签执行顺序 二.document.ready和window.onload的区别 一.不同位置的script标签执行顺序 整个加载的过程从解析头部开始,比如ht ...
- 常见的Message Queue应用场景
在最近的工作的里面有同事问到我说,为什么我们需要一个Message Queue,Message Queue可以在哪些地方用,经过一些整理,大概能找到这些点,假如你有这方面的要求,也可以考虑使用Mess ...
- js事件循环
之前有看过一些事件循环的博客,不过一阵子没看就发现自己忘光了,所以决定来自己写一个博客总结下! 首先,我们来解释下事件循环是个什么东西: 就我们所知,浏览器的js是单线程的,也就是说,在同一时刻,最多 ...
- Spring学习(23)--- AOP之Introductions应用
简介允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现类来代表这些对象 由<aop:aspect>中的<aop:declare-parents>元素声明该元素用 ...
- [codeforces631E]Product Sum
E. Product Sum time limit per test: 1 second memory limit per test: 256 megabytes input:standard inp ...
- jquery.qrcode.min.js(支持中文转化二维码)
详情请看:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/jqueryqrcodeminjs/ 今天还是要讲一下关于二维码的知识,前 ...
- thinkphp5.0学习笔记(四)数据库的操作
ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理.采用PDO ...
- MongoDB--数据库管理
<strong>1.mongod 启动项注释(默认不能生成路径,需手动建立)</strong><br /><span style="white-sp ...
- PHPCMS V9表单向导调用及分页
参考资料如下:v9_form_tlj为你的表单数据表,`flqh`,`title`,`sj`,`username`,`datetime` 为你表单内的字段,page="$_GET" ...
- .Net上传文件大小配置
1.起因 今天同事在上传文件的时候,发现一直失败,说文件比较大.一听就明白了,肯定是上传文件大小的问题啊.然后查看web.config文件,发现设置过文件上传的大小限制.配置文件上传大小,分为2部分. ...