专栏首页BFE.dev前端刷题日记BFE.dev前端刷题2 - 实现curry() 并支持placeholder
原创

BFE.dev前端刷题2 - 实现curry() 并支持placeholder

bfe.dev是一个针对前端的刷题网站,像是前端的LeetCode。该系列文章是我在上面的刷题日记。

题目 2

实现curry() 并支持placeholder. implement curry() with placeholder support

分析 & 代码

和第一问 #1. implement curry() 不同的地方就是对于placeholder的处理,我们先看看example

curriedJoin(1, 2, 3) // '1_2_3'
curriedJoin(_, 2)(1, 3) // '1_2_3'
curriedJoin(_, _, _)(1)(_, 3)(2) // '1_2_3'
复制代码

也就是说,后来的参数需要放置在之前的placeholder的地方。 大概想法和第一问是一样的,除了在判断参数是否够用的时候,需要过滤掉placeholder. 像这样:

const expectedArgLength = func.length
const isArgsEnough = args.length >= expectedArgLength &&
  args.slice(0, expectedArgLength)
    .every(arg => arg !== curry.placeholder)
    
if (isArgsEnough) {
  return func.apply(this, args)
} else {
  // TODO
}

如果参数不够,和之前一样我们需要把参数和后来调用的参数合并在一起,再递归。 但是 Function.prototype.bind 只能简单地按前后顺序concat,所以这里我们不用bind,而是自己寻找placeholder然后merge。

if (isArgsEnough) {
  return func.apply(this, args)
} else {
  return function(...newArgs) {
    // we need merge two arg list,  newArgs and args
    const finalArgs = []
    let i = 0
    let j = 0
    while (i < args.length && j < newArgs.length) {
      if (args[i] === curry.placeholder) {
        finalArgs.push(newArgs[j])
        i += 1
        j += 1
      } else {
        finalArgs.push(args[i])
        i += 1
      }
    }

    while (i < args.length) {
      finalArgs.push(args[i])
      i += 1
    }

    while (j < newArgs.length) {
      finalArgs.push(newArgs[j])
      j += 1
    }
     
    // then just call the curried function again
    return curried(...finalArgs)
  }
}

nice,通过了!

最后

第二问比第一问 BFE.dev#1. implement curry() 要难一些。有兴趣的话你也可以挑战一下。

感谢阅读,希望能有些帮助,下次见。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • BFE.dev前端刷题1 - 实现curry()

    也就是说 curry() 需要返回一个function,这个function接受任意数量的参数,并且

    JSer
  • BFE.dev前端刷题#58. 获取DOM tree高度

    一个tree的高度 = 子tree的最大高度 + 1。由此我们可以很容易地得到递归解法。

    JSer
  • BFE.dev前端刷题 33. 实现Promise.allSettled()

    和Promise.all()不同,Promise.allSettled()即使是遇到rejection也会等待所有的promise到最后。所以我们只需要用一个a...

    JSer
  • 云服务安全隐患是企业选择云的最大障碍

    根据云安全联盟的年度调查显示,虽然企业及其员工正在越来越多的使用云计算服务,但企业高管仍然担心业务数据存储在云计算中所涉及的安全隐患。 这个“云部署做法和重点调...

    静一
  • 记一次数据同步需求的改进(一) (r7笔记第2天)

    最近有个需求,开发的同事找到我,提出了下面的需求 由于平台业务发展需要,需要将test_account_log 和test_protect_log 表前一天的增...

    jeanron100
  • Python(xlrd、xlwt模块)操

    关于Python的xlrd、xlwt模块的使用,推介另一位博客主的博文:https://www.cnblogs.com/zhoujie/p/python18.h...

    py3study
  • 专家谈:2014年云计算市场大气候

    去年,我们的云计算专家们对2013年云计算市场的大环境进行了预测。有些预言得到了市场的验证,例如亚马逊公司网络服务(AWS)继续占据了市场的主导地...

    小莹莹
  • 【2020HBU天梯赛训练】7-9 天梯赛座位分配

    天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所...

    韩旭051
  • C# 基础知识系列- 6 Lambda表达式和Linq简单介绍

    C#的lambda和Linq可以说是一大亮点,C#的Lambda无处不在,Linq在数据查询上也有着举足轻重的地位。

    程序员小高
  • 移动机器人,移动的目标?

    移动机器人,移动的目标 NIST的研究揭示了开发工业移动机器人安全标准的复杂性。为自主移动平台设计安全标准是一回事,但现在添加机器人手臂或其他类型的附件,无论...

    机器人网

扫码关注云+社区

领取腾讯云代金券