zoukankan      html  css  js  c++  java
  • compose组合函数

    reduce实现

    function compose(...funcs) {
      //没有传入函数参数,就返回一个默认函数(直接返回参数)
      if (funcs.length === 0) {
        return arg => arg
      }
    
      if (funcs.length === 1) {
      // 单元素数组时调用reduce,会直接返回该元素,不会执行callback;所以这里手动执行
        return funcs[0]
      }
      // 依次拼凑执行函数
      return funcs.reduce((a, b) => (...args) => a(b(...args)))
    }

    reduce的详细说明可以查阅MDN

    举例分析:compose(f4,f3,f2,f1)(c,d,e)

    • reduce回调函数第一次执行时,返回值为 函数 (...args) => f4(f3(...args)),作为下一次执行的a参数
    • 回调函数第二次执行时,返回值为 函数(...args) => f4(f3(f2(...args))),作为下一次执行的a参数
    • 回调函数第三次执行时,返回值为 函数(...args) => f4(f3(f2(f1(...args))))

    最右边的参数f1可以接受多个参数,然后返回结果传给下一个函数f2,返回结果再传入f3··· f3最先被调用,会等待f2的结果,再等待f1的结果。

    let a = (x, y) => x + y,
    b = x => x * x,
    c = x => x === 0 ? x : 1 / x;
    compose(c, b, a)(1, 2); // 1/9

    那么如果想从左到右返回结果呢?

    1. 使用reduceRight
    2. funcs倒序

    迭代实现

    用迭代的方式实现从右到左依次执行的组合函数。

    function compose(...funcs) {
        let length = funcs.length;
        return function(...arg) {
            let index = length - 1,
            result = length > 0 ? funcs[index].apply(this, arg) : arg; //注意arg为数组,要用apply
            while (--index >= 0) {
                result = funcs[index].call(this, result);
            }
            return result;
        }
    }

    通过index来标记应该执行哪个函数,这里是从最右边(length - 1)开始执行的,每执行一个index就减1,直到index0(最左边)为止。
    result来记录每次函数执行的返回值,每次都会更新,直到所有函数都执行完。才会返回最终结果
    如果传递的函数列表为空,则返回传入参数。

    同样的如果需要从左到右依次执行,则将funcs倒序即可。

    参考链接:https://www.cnblogs.com/shapeY/p/10693552.html

  • 相关阅读:
    Vulnhub-靶机-DJINN: 1
    8.8-9 sqlmap从入门到精通-其中小技巧-分析大文件日志技巧
    Vulnhub-靶机-EVM: 1
    8.7 sqlmap从入门到精通-Linux服务器登录连接日志分析
    Linux操作系统常规的分析SSH登录日志需要使用的命令和记录
    CentOS最小安装无法使用ifconfig命令
    CentOS7下安装FTP服务
    解决Centos7安装后无法联网的问题
    Maven引入本地jar包
    Tomcat下安装solr6.x
  • 原文地址:https://www.cnblogs.com/ziyoublog/p/14749395.html
Copyright © 2011-2022 走看看