JavaScript之典型高阶函数

转自:cnblogs   发布者: html5cn

几个函数

  这几个方法均为javascript 1.6 数组新增的方法。是很典型的functional 函数,当然也非常实用。下面是functional的定义并不来自javascript。


filter:接受一个集合Xs(X表示类型,s表示集合),一个谓词,这个谓词是从Xbool的映射(函数)。然后过虑这个集合,并返回谓词为true的元素组成的集合。下面是简单的实现:


1 function filter(arr,callback){
2     var i,out=[];
3     for(i=0;i<arr.length;i++){
4         if(callback(arr[i]))
5             out.push(arr[i]);
6     }
7     return out;
8 }

再加一个简单的测试:


1 var arr = [1,2,3,4,5,6,7,8,9,10];
2 var even = function(item){
3     if(typeof item !== "number") return false;
4     return !(item & 1);
5 };
6 var filtered = filter(arr,even);
7 console.log(filtered);

结果:

2,4,6,8,10

map:接受一个集合Xs,一个函数f,然后把Xs集合中每一个元素按照顺序使用f映射,并返回集合f x1, f x2, f x3 ... f xn。实现如下:


1 function map(arr,callback){
2     var i,l= arr && arr.length || 0,out = new Array(l);
3     for(i=0;i<l;i++)
4         out[i]=callback(arr[i]);
5     return out;
6 }

测试一下:


1 var arr = [1,2,3,4,5,6,7,8,9,10];
2 var addTen = function(item){
3     return item + 10;
4 };
5 var mapAdded = map(arr,addTen);
6 console.log(mapAdded);

结果:


11,12,13,14,15,16,17,18,19,20


        另外还有forEach,every和some三个函数在javascript 1.6中出现。但在使用过程中感觉还是缺少一个有力的函数,它就是折叠函数(fold)。正所谓map-reduce,有了map而没有"reduce"岂不是很扫兴?下面就来看看这个”reduce“。


Reduce的实现


  上面说的reduce其实也就是折叠函数(fold)。它接受一个Xs集合,一个二元操作符f。然后将f插入到集合中的每两个相邻元素之间。举个例子,fold plus [1,2,3,4] 意即 1+2+3+4。为了更加精确,通常需要一个”起始元素“作为f最开始时的第二个参数。例如 fold plus [1,2,3,4] 意即 (1+(2+(3+(4+0)))。下面是实现:


1 function fold(arr,callback,b){
2     var i,x;
3     if(b) x=b,i=0;
4     else x=arr[0],i=1;
5     for(;i<arr.length;i++)
6         x=callback(arr[i],x);
7     return x;
8 }

测试:


var arr = [1,2,3,4,5,6,7,8,9,10];
var plus = function(a,b){
    return a+b;
};
var foldPlus = fold(arr,plus,0);
console.log(foldPlus);

结果:

55

这个函数在ECMAScript 5中名字就叫reduce,而函数式里面通常称做fold而已,这是很形象的名字。

总结


  其实上面在实现这些functional函数的时候编写风格并不是函数式的,因为javascript 语言有具有循环语句。如果没有循环语句呢?留给下一次探索吧。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值