利用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. es6之Generator

    1.Generator函数其实是一个封装了多个内部状态的状态机,执行它会返回一个遍历器对象,然后可以依次遍历Generator中的每一个状态,也就是分段执行,yield是暂停执行的标记,next恢复执 ...

  2. Apache许可翻译

    https://www.apache.org/licenses/LICENSE-2.0 Apache许可 2.0 2004.1 使用.复制和发行的术语和条件. 1 定义 "License&q ...

  3. Git详细教程(3)---结合gitHub使用

    1.GitHub的基本使用 GitHub就是一个网站,本身是基于Git,可以完成版本控制,可以托管代码. 英文版的. 在使用GitHub之前,首先需要注册一个账号. 登录,就可以完成相关的一些操作. ...

  4. kafka 0.10.2 cetos6.5 集群部署

    安装 zookeeper http://www.cnblogs.com/xiaojf/p/6572351.html安装 scala http://www.cnblogs.com/xiaojf/p/65 ...

  5. 数据库插入数据失败,log提示不能将值 NULL 插入列 'id'

    已经记不住具体的log信息了,意思就是ID如果没有设置为自增长的情况下就不能插入数据,而建表时ID字段是设置为"not null",所以就不能顺利插入数据. 解决方法有两种: ①建 ...

  6. 小程序地图map

    wxml: <button class="button" bindtap="getlocation" style="margin-top:30p ...

  7. python标准库]Hashlib

    hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法. 在学习hashlib模块之前,先来看 ...

  8. [Leetcode] Binary tree level order traversal二叉树层次遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  9. (转)Windows下tail命令工具(转)

    因为随笔无转载按钮,先说明原文地址是: Windows 下 tail 查看日志命令工具分享 使用方法: 下载后解压,把tail.exe 复制到 目录:C:\Windows\System32 下 文件下 ...

  10. 织梦DEDECMS中的默认文件夹的名称怎么修改呢?

    1.首先找到系统配置文件,一般此文件会存放在Include目录下,文件名称为:common.inc.php.         2.打开common.inc.php,以修改模板目录templets为例, ...