fedono / fe-questions

1 stars 0 forks source link

1. 实现sum(1,2,3)==sum(1)(2)(3) #1

Open fedono opened 4 years ago

fedono commented 4 years ago
const curry = fn => {
    const len = fn.length;
    return function curried(...args) {
        if (args.length === len) {
            return fn.apply(null, args);
        }
        return (..._args) => {
            return curried.apply(null, [...args, ..._args]);
        };
    };
};

const sum = (x, y, z) => x + y + z;
const add = curry(sum);

// 6
add(1, 2, 3);

// 6
add(1,2)(3);

// 6
add(1)(2,3);

// 6
add(1)(2)(3);

思路确实很好

  1. const len = fn.length; 计算函数的正常需要多少个参数
  2. 如果args.length === len 也就是按照正常的传参(1, 2, 3)
  3. 如果不等于,就相当于是(1,2)(3); 或者 (1)(2,3);或者(1)(2)(3); 这种传参方式
  4. 这时候 return 一个函数,内部继续调用curried 来计算参数的个数,使用 apply 第二个参数是个数组,把所有的参数都汇总成成单个数组,
  5. 到最后 args.length === len 的时候,就是按照正常的传参来计算了
fedono commented 4 years ago

更多参考 Advanced-Frontend/Daily-Interview-Question#134