2. 实现有占位符的curry函数

frontend

# 题目链接

https://bigfrontend.dev/problem/implement-curry-with-placeholder (opens new window)

# 题目说明

const  join = (a, b, c) => {
   return `${a}_${b}_${c}`
}

const curriedJoin = curry(join)
const _ = curry.placeholder

curriedJoin(1, 2, 3) // '1_2_3'

curriedJoin(_, 2)(1, 3) // '1_2_3'

curriedJoin(_, _, _)(1)(_, 3)(2) // '1_2_3'
1
2
3
4
5
6
7
8
9
10
11
12

实现一个curry函数,该函数参数是函数join,返回值还是一个函数。如果有下划线,那么称为占位符。后面的参数要替换当前的参数、

# 题目解析

  • 需要判断join的参数个数和返回的函数给的参数个数
    • 如果大于等于还需要判断在个数内是否有占位符,如果都是数字就可以返回运算结果了
  • 如果不满足上述条件,就需要返回新的函数
  • 在新函数接收的参数中,进行占位符的替换,并且返回cur函数
/**
 * @param { (...args: any[]) => any } fn
 * @returns { (...args: any[]) => any }
 */
function curry(fn) {
  let len = fn.length
  return cur = (...args) => {
    if (args.length >= len && !args.slice(0, len).includes(curry.placeholder)) return fn.call(this, ...args)
    return (...newArgs) => {
      args = args.map(item => item === curry.placeholder && newArgs.length ? newArgs.shift() : item)
      return cur(...args, ...newArgs)
    }
  }
}


curry.placeholder = Symbol()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
更新时间: 2022-11-21 16:22