关于实现JavaScript布尔柯里化函数的技术问询
解决布尔柯里化函数
isPresent的实现问题 你的柯里化思路方向是对的,但原代码里有两个关键问题,导致没法得到预期结果:
- 递归调用
isPresent时传入的是布尔值(s.includes(b) && s.includes(a)),而不是待检查的字符,后续调用时会把这个布尔值当作参数去判断,逻辑完全跑偏了 - 没有正确累积所有传入的待检查字符,而是每次只对比两个字符,无法处理多个参数的链式调用场景
下面是符合你需求的正确实现方案,利用闭包来保存所有传入的参数,最后在无参调用时统一校验:
const s = "ajkjxa"; function isPresent(char) { // 用闭包保存已经收集到的待检查字符列表 const collectedChars = []; // 处理第一次调用时传入的参数 if (typeof char !== 'undefined') { collectedChars.push(char); } // 返回可链式调用的内部函数 return function next(...args) { // 如果有传入参数,加入列表并返回自身,继续接收后续参数 if (args.length > 0) { collectedChars.push(...args); return next; } // 无参调用时,检查所有收集到的字符是否都在s中 return collectedChars.every(c => s.includes(c)); }; }
测试你给出的调用场景,结果完全符合预期:
console.log(isPresent("a")("j")("x")()); // 输出 true console.log(isPresent("a")("j")("x")('b')()); // 输出 false
实现逻辑拆解:
- 外层函数
isPresent初始化一个空数组collectedChars,通过闭包让内部函数next可以持续访问这个数组,用来存储所有传入的待检查字符 - 第一次调用
isPresent时如果传入了字符,先把它加入数组 - 内部函数
next负责后续的参数处理:- 当
next被传入参数时,把参数追加到数组里,然后返回自身,这样就能实现链式调用(比如func()()()) - 当
next被无参调用时,用数组的every方法遍历所有收集到的字符,检查每个字符是否都存在于字符串s中,返回最终的布尔值
- 当
如果需要调整边界情况(比如isPresent()无参调用时返回false而不是默认的true),可以在无参校验时加个判断:
return collectedChars.length === 0 ? false : collectedChars.every(c => s.includes(c));
内容的提问来源于stack exchange,提问作者Infopedia
相关产品推荐
相关产品推荐

