Appearance
实现有占位符的curry函数
题目链接
https://bigfrontend.dev/problem/implement-curry-with-placeholder
题目说明
js
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'
实现一个curry函数,该函数参数是函数join,返回值还是一个函数。如果有下划线,那么称为占位符。后面的参数要替换当前的参数、
题目解析
- 需要判断join的参数个数和返回的函数给的参数个数
- 如果大于等于还需要判断在个数内是否有占位符,如果都是数字就可以返回运算结果了
- 如果不满足上述条件,就需要返回新的函数
- 在新函数接收的参数中,进行占位符的替换,并且返回cur函数
js
/**
* @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()