js的柯里化函数和组合函数

91 阅读2分钟

在搜索了部分资料后,对函数的柯里化和组合化进一步了解。其中感觉比较好的一篇文章www.zhangshengrong.com/p/OQNzel8Ea…

柯里化函数

是把接收多个参数的函数,变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数,而且返回结果的新函数的技术;个人理解就是:函数返回了一个一个接收新参数的函数

举个栗子

平常的相加函数
let sum = (x,y,z) => x+y+z
sum(1,2,3)    // 此时只是一个简单的纯函数 1+2+3

柯里化
function add(x) {
    return function(y) {
      return function(z) {
        return x+y+z
      }
    }
}
console.log(add(1)(6)(7))   14
// 就是先将1传入 ,返回一个传入6的函数,这个传入6的函数又返回一个传入7的函数,传入7的这个函数执行1+6+7 = 17

组合函数

当需要对数据进行一次函数1,函数2的处理,这个数据就可以用到组合函数。举个栗子

let kaixiao = [
        {
          type: "日常",
          price: 200,
        },
        {
          type: "日常",
          price: 121,
        },
        {
          type: "吃饭",
          price: 300,
        },
        {
          type: "喝酒",
          price: 400,
        },
        {
          type: "甜品",
          price: 500,
        },
        {
          type: "游玩",
          price: 600,
        },
      ]

      let getType = type => type.filter((item) => item.type == '日常') 
// 获取到类型为日常的数组开销
      let getMoney = money =>  money.map((item) => item.price).reduce((sum,item) => sum + item,0)
// 计算开销数量
      const compost = (func1,func2) => {
        return source => func2(func1(source))
      }
      // 这里指的是  compost函数返回了一个函数,这个函数需要一个参数,func1函数拿到这个参数后执行的结果再由func2执行。
      //(也就是返回  func2执行func1执行参数的结果的结果)
      
      
// 要知道日常开销的花费总额  就需要先知道日常这一种类的开销数据,然后在进行处理,这个
// 时候就可以用到组合函数
// 个人理解组合函数也算柯里化的一种,只是参数是函数而已
      const sumMoney = compost(getType,getMoney)
      console.log(sumMoney(kaixiao), 'asdasd')