利用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一个函数式编程-------求标准差的更多相关文章

  1. 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  2. 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 引言&前言

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 译者团队(排名不分先后):阿希.blueken.brucec ...

  3. 翻译连载 | 第 10 章:异步的函数式(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  4. 翻译连载 | 第 10 章:异步的函数式(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  5. 翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  6. 翻译连载 | 附录 A:Transducing(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  7. 翻译连载 | 附录 A:Transducing(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  8. 翻译连载 | 附录 B: 谦虚的 Monad-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  9. 翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

随机推荐

  1. Sqoop简介及安装

    Hadoop业务的大致开发流程以及Sqoop在业务中的地位: Sqoop概念 Sqoop可以理解为[SQL–to–Hadoop],正如名字所示,Sqoop是一个用来将关系型数据库和Hadoop中的数据 ...

  2. js继承之原型链继承

    面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法. 一.构造函数.原型与实例之间的关系 每创建一个函数,该函数就会自动带有一个 prototype 属性.该属性是个指针, ...

  3. malloc与new相关

    前言: 通常我们使用数组的时候:必须提前用一个常量来指定数组的长度,同时它的内存空间在编译的时候就已经被分配了.但是有时候数组的长度只有在运行的时候才能知道.因此,一种简单的解决方案就是提前申请一块较 ...

  4. 容器扩展属性 IExtenderProvider 实现WinForm通用数据验证组件

    大家对如下的Tip组件使用应该不陌生,要想让窗体上的控件使用ToolTip功能,只需要拖动一个ToolTip组件到窗口,所有的控件就可以使用该功能,做信息提示. 本博文要记录的,就是通过容器扩展属性 ...

  5. 搭建eureka服务

    1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...

  6. ZooKeeper分布式锁浅谈(一)

    一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的 ...

  7. jquery+js实现鼠标位移放大镜效果

    jQuery实现仿某东商品详情页放大镜效果 用jquery+js实现放大镜效果,效果大概如下图! 效果是不是大家很感兴趣,放大镜查看细节,下边大家可以详细看一看具体是怎么实现的.下边直接看代码! HT ...

  8. JavaSE教程-04Java中循环语句for,while,do···while-练习2

    1.编写一个剪子石头布对战小程序 该法是穷举法:将所有情况列出来 import java.util.*; public class Game{ public static void main(Stri ...

  9. 构建工具Gulp

    前面的话 与grunt类似,gulp也是构建工具,但相比于grunt的频繁IO操作,gulp的流操作能更快更便捷地完成构建工作.gulp借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接 ...

  10. Mybatis配置(一)

    1.导入Mybatis包 2.得到SqlSession来访问数据库 /** * 访问数据库 */public class DBAccess {          public SqlSession g ...