柯里化函数库ramda使用心得

691 阅读4分钟

柯里化函数库ramda使用心得

前端常见编程模式

  • 命令式

    命令式编程是一种通过编写指令来告诉计算机如何执行任务的编程风格,在命令式编程中,程序员需要显式地指定每个操作的详细步骤,包括控制流程和数据处理。

    // 循环遍历数组将每个元素加倍并筛选大于5的数
    const arr = [1, 2, 3, 4, 5];
    const res = []
    for (let i = 0; i < arr.length; i++) {
      if(i * 2 > 5){
        res.push(i * 2)
      }
    }
    console.log(res) // 输出 [6, 8, 10]
    
  • 声明式

    声明式编程是一种通过定义程序的结果来描述计算机应该如何执行任务的编程风格,在声明式编程中,程序员只需指定要实现的目标,而不是每个操作的详细步骤。

    // 使用数组的 map 方法将每个元素加倍并筛选大于5的数
    const arr = [1, 2, 3, 4, 5];
    const doubledArr = arr.map((x) => x * 2).filter((x) => x > 5);
    console.log(doubledArr); // 输出 [6, 8, 10]
    
  • 函数式

    函数式编程是一种通过将计算视为数学函数的组合来解决问题的编程范式,在函数式编程中,程序员将函数作为基本构建块,通过组合和调用这些函数来完成任务。函数式编程强调不可变数据和无副作用函数,可以提高代码的可读性、可维护性和可扩展性,在 JavaScript 中,常用的函数式编程库包括 lodash 和 Ramda 等。

    // 使用 Ramda 库来实现函数式编程
    const arr = [1, 2, 3, 4, 5];
    const doubleAndFilter = R.pipe(
      R.map((x) => x * 2),
      R.filter((x) => x > 5)
    );
    console.log(doubleAndFilter(arr)); // 输出 [6, 8, 10]
    

柯里化函数优势

函数柯里化是一种将接受多个参数的函数转换为接受一个参数并返回一个新函数的技术。柯里化后的函数可以方便地进行函数组合、部分应用和延迟执行,从而提高代码的可读性、可维护性和可重用性。以下是函数柯里化的一些优势:

  • 简化参数传递:柯里化后的函数可以接受一个参数,而不是多个参数。这样可以简化函数调用时的参数传递,使代码更加清晰易懂。
  • 支持部分应用:柯里化后的函数可以返回一个新函数,这个新函数可以只接受一部分参数。这样就可以支持部分应用,即先传入部分参数,然后再传入剩余参数。这样可以提高代码的可重用性和灵活性。
  • 支持函数组合:柯里化后的函数可以方便地进行函数组合,即将多个函数组合成一个函数。这样可以提高代码的可读性和可维护性。
  • 支持延迟执行:柯里化后的函数可以返回一个新函数,这个新函数可以等到所有参数都准备好之后再执行。这样可以支持延迟执行,即在需要的时候才执行函数。
  • 更好的可测试性:柯里化后的函数可以更方便地进行单元测试,因为可以更容易地构造和传入测试数据,并对测试数据进行断言和验证。

常见应用场景

排序

日常写法

list.sort((a, b) => {
    /** 状态排序值 */
    const statusVal = (): number => {
      const val = statusOrderMap[a.status] - statusOrderMap[b.status]
      if (Number.isNaN(val)) return 0
      else return val
    }
    /** 时间排序值 */
    const timeVal = () => {
      const val = moment(a.createdTime).valueOf() - moment(b.createdTime).valueOf()
      if (Number.isNaN(val)) return 0
      else return val
    }
​
    return 0
  })
​
  return newList

使用ramda后

export function sort<T extends BasicCompareType>(list: readonly T[]): T[] {
  const sort = R.sortWith<T>([
    R.descend(R.prop('status')),
    R.ascend(R.prop('createdTime')),
  ])
​
  return sort(bondList)
}

多条件筛选

const data = [  { name: 'John', age: 25, gender: 'male' },  { name: 'Jane', age: 30, gender: 'female' },  { name: 'Bob', age: 20, gender: 'male' },  { name: 'Alice', age: 35, gender: 'female' },];
​
const getNamesOfFemalesAbove30 = R.pipe(
  R.filter(R.where({ gender: R.equals('female'), age: R.gt(R.__, 30) })),
  R.map(R.prop('name'))
);
​
const result = getNamesOfFemalesAbove30(data); // ['Alice']

多条件校验

const isPositive = (n) => n > 0;
const isEven = (n) => n % 2 === 0;
const isGreaterThanTen = (n) => n > 10;
​
const validateNumber = R.allPass([isPositive, isEven, isGreaterThanTen]);
​
console.log(validateNumber(12)); // true
console.log(validateNumber(9)); // false
console.log(validateNumber(-6)); // false
console.log(validateNumber(20)); // true

相关阅读

llh911001.gitbooks.io/mostly-adeq…

juejin.cn/post/684490…

学习函数式编程真正的意义在于:让你意识到在指令式编程,面向对象编程之外,还有一种全新的编程思路,一种用函数的角度去抽象问题的思路。学习函数式编程能大大丰富你的武器库,不然,当你手中只有一个锤子,你看什么都像钉子。