Skip to content

实现一个add(1,2,3)(4)(5,6)(7,8,9)(10) #2

@jiefancis

Description

@jiefancis

这种典型的题,一般的做法是函数柯里化与类型转换

  • 函数柯里化
    • 函数柯里化的解法存在局限性,需要提前定义一个函数,且参数个数跟add参数数量一致,作为函数运行的终止条件,代码如下
 function sum(...args) {
     return args.reduce((p,n) => p+n,0) 
 }
 // capacity表示参数个数
 function curry(fn, capacity) {
     let _args = Array.from(arguments).slice(2)
     return function f(...args) {
           _args = _args.concat(args)
           if(_args.length === capacity) {
               return fn.apply(null, _args)
           } else {
              return f
           }
     }
 }

此时add(1,2,3)(4)(5,6)(7,8,9)(10)改成add(1,2,3)时,需要执行 add = curry(sum, 3),重新定义参数个数。有没有更好的解决方案呢?

  • fn.toString与类型转换
  function add(...args) {
       let sum = args.reduce((p,n) => p+n, 0);
       const fn = (...params) => {sum = params.reduce((p,n) => p+n, sum); return fn }
       fn.toString = () => sum
       return fn
  }
  +add(1,2,3)(4)(5,6)(7,8,9)(10)

这里需要说一下就是add函数的使用要加上 + 号,否则浏览器不会返回1-10的累加值。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions