您的位置:首页 > 编程语言

数组的map()与reduce()函数式编程技术及详解

2018-03-27 09:38 393 查看
和Lisp、Haskell 不同,JavaScript并非函数式编程语言,但在JavaScript中可以像操控对象一样操控函数也就是说可以再JavaScript中应用函数式编程技术。ECMAScript 5 中的时更要注意方法 (诸如map() 和reduce() )就可以非常适合用于函数式编程风格。如:计算数组元素的平均值和标准差
先使用非函数式编程风格实现:var data = [1,1,3,5,5];//这里是待处理的数组;
//平均数是所有元素的累加和值除以元素个数
var total = 0;
for (var i = 0; i < data.length; i++) {
total += data[i];
}
var mean = total/data.length;//平均数是3

//计算标准差, 首先计算每个数据减去平均数之后偏差的平方然后求和
total = 0;
for (var i = 0; i < data.length; i++) {
var deviation = data[i] - mean;
total += deviation * deviation;
}
var stddev = Math.sqrt (total/ (data.length - 1) ); // 标准差的值是2接下来使用ECMAScript 5 中的map()与reduce()来实现同样的计算//首先定义两个简单的函数
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) ) ;
p.s  map与reduce详解
map()方法:map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。map() 方法按照原始数组元素顺序依次处理元素。注意: map() 不会对空数组进行检测。注意: map() 不会改变原始数组。

reduce()方法

reduce()方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。这个方法是如何工作的呢?
reduce
接受一个函数,函数有四个参数,分别是:     1、上一次的值;     2、当前值;     3、当前值的索引;     4、数组;
[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
});
得到的结果:



分析一下这个结果,这个回调函数共调用了4次,因为第一次没有
previousValue
,所以直接从数组的第二项开始,一只调用到数组结束。
reduce
还有第二个参数,我们可以把这个参数作为第一次调用
callback
时的第一个参数,上面这个例子因为没有第二个参数,所以直接从数组的第二项开始,如果我们给了第二个参数为5,那么结果就是这样的:[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array){
return previousValue + currentValue;
},5);?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: