serendipityApe / javascriptPromotion

资深前端必备的编码问题
3 stars 0 forks source link

实现柯里化2 #3

Open serendipityApe opened 2 years ago

serendipityApe commented 2 years ago

题目 基于上个问题,实现一个支持占位符的curry 例子


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'


> 答案

function curry(fn) { return function innerFunc(...args){ //如果参数都不是placeholder且长度满足,执行fn const complete=args.length >= fn.length && !args.slice(0,fn.length).includes(curry.placeholder); if(complete){ return fn.apply(this,args); }else{ return function(...next){ //依次替换上一个函数的placeholder const res=args.map(arg => arg === curry.placeholder && next.length ? next.shift() : arg); return innerFunc(...res, ...next); } } } } curry.placeholder = Symbol()