函数式编程:函数组合compose

  • 通过arr[0]拿到end 简单的需求复杂的写法 探索函数组合
  var testArr = ['start','middle','end'];
  • 函数1:定义header 输入一个数组 返回数组的第一个元素
  var header = arr => arr[0];
  • 函数2: 定义reverse 输入一个数组 将数组中的元素倒转(顺便熟悉一下数组的归并方法reduce和reduceRight)
  var reverse = function(arr){
     return arr.reduceRight(function(prev,cur){
         return prev.concat([cur])
     },[])
  }
  
  或以下写法
 
  var reverse = (arr)=>arr.reduceRight((prev,cur)=>prev.concat([cur]),[])

  console.log(reverse(testArr)); //  ["end", "middle", "start"]
  • reduceRight第一个参数:
    回调函数(在每一项上调用的函数)从右往左
    参数1:前一个值 prev
    参数2:当前值 cur
    参数3:项的索引 index
    参数4:数组对象 array
  • reduceRight第二个参数(可选)作为归并基础的初始值

这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数是数组的第二项。(所以只会执行arr.length-1次)。当然如果传第二个参数作为prev的初始值,那么就会执行arr.length次。 此例中传空数组[]作为第二个参数,是为了让prev一开始就是作为一个数组执行concat方法连接数组,不然第一个遍历的"end"调用concat方法会变成"endmiddle"
reduceRight的返回值就是遍历完整个数组并操作之后的最终值

  • 函数3: compose函数是一个封装 返回值也是一个函数 这个新函数传的参将被return的这个匿名函数接受
  • 所以这里需要用到reduce(跟reduceRight一样 只不过是从左往右) 函数的第二个参数 将这个需要处理的参数传进来作为初始值 交给...fns中的函数去处理

相当于把arr交给reverse函数处理 然后返回值再交给header函数处理

  var compose = function(...fns){
      return function(arr){
          return fns.reduce(function(val,fn){
              return fn(val)
          },arr)
      }
  }
  
  或以下写法

  var compose = (...fns)=>(arr)=>fns.reduce((val,fn)=>fn(val),arr)
  
  var last = compose(reverse,header)
  console.log(last(testArr)); // 'end'

你可能感兴趣的:(函数式编程:函数组合compose)