【JS函数手撕】柯里化函数lodash.curry

70 阅读1分钟

🌰 一、什么是柯里化?

柯里化(Currying)lodash.curry 是 Lodash 库中的一个函数,用于柯里化一个函数。将一个多参数函数,转换为一系列嵌套的一元函数(只接受一个参数的函数) 。

面试中,我们需要手撕的就是lodash.curry

示例(未柯里化):
function add(a, b, c) {
  return a + b + c;
}

add(1, 2, 3); // 6
柯里化后:
add(1)(2)(3); // 6

🛠 lodash.curry使用方式

✅ 1. 安装 Lodash(如果你还没装):
npm install lodash

或者使用 ES 模块方式只引入 curry

npm install lodash.curry

✅ 2. 使用示例
import _ from 'lodash'; // 或 const _ = require('lodash');

function add(a, b, c) {
  return a + b + c;
}

const curriedAdd = _.curry(add);

// 你可以像这样一步步传参:
console.log(curriedAdd(1)(2)(3)); // 6

// 也可以一次传多个参数:
console.log(curriedAdd(1, 2)(3)); // 6
console.log(curriedAdd(1)(2, 3)); // 6
console.log(curriedAdd(1, 2, 3)); // 6

✂️ 手撕柯里化函数【lodash.curry】

我们写一个通用的 curry 工具函数,可以把任意函数柯里化:

function curry(fn){
    const flength = fn.length //原参数个数
    function curried(...args){
        if(args.length >= flength){
            return fn(...args) //参数够了,直接执行原函数
        }else{
            return function(...nextargs){
                return curried(...args,...nextargs) //参数不够,继续收集
            }
        }
    }
    return curried
}

✅ 使用示例

function multiply(a, b, c) {
  return a * b * c;
}

const curriedMultiply = curry(multiply);

console.log(curriedMultiply(2)(3)(4));     // 24
console.log(curriedMultiply(2, 3)(4));     // 24
console.log(curriedMultiply(2)(3, 4));     // 24
console.log(curriedMultiply(2, 3, 4));     // 24

💡 可以灵活地一次传多个参数或一个参数,直到传够为止再执行。


🚀 实际中适合柯里化的地方:

场景描述
表单处理handleChange(field)(e)
API 封装apiCallWithToken(token)(endpoint)(data)
权限处理 / 角色控制withRole('admin')(fn)
状态更新(Redux/Vuex)updateState(key)(value)
统一请求处理(中间件)withLogging(level)(handler)(req, res)