You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于实现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

实现逻辑拆解:

  1. 外层函数isPresent初始化一个空数组collectedChars,通过闭包让内部函数next可以持续访问这个数组,用来存储所有传入的待检查字符
  2. 第一次调用isPresent时如果传入了字符,先把它加入数组
  3. 内部函数next负责后续的参数处理:
    • 当next被传入参数时,把参数追加到数组里,然后返回自身,这样就能实现链式调用(比如func()()())
    • 当next被无参调用时,用数组的every方法遍历所有收集到的字符,检查每个字符是否都存在于字符串s中,返回最终的布尔值

如果需要调整边界情况(比如isPresent()无参调用时返回false而不是默认的true),可以在无参校验时加个判断:

return collectedChars.length === 0 ? false : collectedChars.every(c => s.includes(c));

内容的提问来源于stack exchange,提问作者Infopedia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:22:49