zoukankan      html  css  js  c++  java
  • javascript之典型高阶函数

    缘由

      虽然以前也使用过javascript语言,但终究是为了配合后端写的一些零零散散的“代码段”,更不能说是javascript项目了。很荣幸的是上个月刚到公司正好碰上项目开始推倒重写,我们team从头开始做架构和实现,目的很清楚,为了改进和超越前面的版本。这是个真正意义上的javascript“项目”,当然服务端不是我们team来负责啦。这也是我真正开始全职使用javascript来编程。由于之前在学校对形式化方法这门课程比较感兴趣,而javascript又是函数式语言,因此我想把更多functional的东西用javascript来表现一下。

    几个函数

      这几个方法均为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 语言有具有循环语句。如果没有循环语句呢?留给下一次探索吧。

  • 相关阅读:
    [LeetCode] 60. Permutation Sequence 序列排序
    [LeetCode] 31. Next Permutation 下一个排列
    [LeetCode] 47. Permutations II 全排列 II
    [LeetCode] 46. Permutations 全排列
    [LeetCode] 77. Combinations 全组合
    利用 Json.Net 将对象转换成Json
    使用sqlmetal工具自动生成SQL数据库的Linq类文件
    SharePoint 2013 设置 显示详细错误信息 修改位置总结
    本地访问Vmware虚机Web网站
    Web项目HttpContext.Current 为空
  • 原文地址:https://www.cnblogs.com/mike442144/p/2838296.html
Copyright © 2011-2022 走看看