函数组合应用 笔记

函数式编程的一部分内容

简单例子,先感受一下, 从右向左依次执行

// 返回一个函数, 执行顺序为从右向左, 第一个函数返回的结果为,下一个函数的参数
          function compose (f, g) {
            return function (data) {
                return f(g(data))
            }
          }
          
          function toUpperCase (str) {
            return str.toUpperCase();
          }
          
          function add (str) {
            return str + "!"
          }
          
          let f = compose(toUpperCase,add);
          console.log(f("time"));
          
          

兼容一般情况的封装

          function compose () {
            var args = [].slice.call(arguments);
            var len = args.length - 1;
            return function (data) {
                var result = args[len](data);
                while (len--){
                    result = args[len](result);
                }
                return result
            }
          }

测试

          function toUpperCase (str) {
            return str.toUpperCase();
          }
          
          function add (str) {
            return str + "!"
          }
          
          function split (str) {
            return str.split("");
          }
          
          function reverse (arr) {
            return arr.reverse();
          }
          
          function join (arr) {
            return arr.join("=");
          }
          
          let f = compose(join,reverse,split,toUpperCase,add);
          console.log(f("time"));/!=E=M=I=T

用reduceright优化

          function compose () {
            var args = [].slice.call(arguments);
            return function (data) {
             return args.reduceRight(function (res, cb) {
                    return cb(res);
                },data)
            }
          }

用es6优化

const compos1e = (...args) => (data) => args.reduceRight((res,cb) => cb(res), data);

也可以改变方向, 从左向右传递,执行,
不过一般称为管道, pipe

const pipe = (...args) => (data) => args.reduce((res,cb) => cb(res), data);

你可能感兴趣的:(函数组合应用 笔记)