BFE.dev前端刷题2 - 实现curry() 并支持placeholder
时间:2022-07-23
本文章向大家介绍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() 要难一些。有兴趣的话你也可以挑战一下。
感谢阅读,希望能有些帮助,下次见。
- 杨廷琨 - 用SQL解析神奇的扑克牌魔术
- Spring boot with Spring security
- Spring RestFul and RestTemplate
- Spring boot with Velocity template
- Oracle 11g R2 RAC 高可用连接特性 – SCAN 详解
- Spring boot · 链接池配置
- Linux下命令行图片格式转换
- 用SQL解一道有趣的数学题:Gauss和Poincare
- OpenSSL 转换证书格式
- 电子邮件服务器DKIM配置
- 自相矛盾:一个进程可以自成死锁么?
- 数据库安全·开发加密插件
- wordpress无法安装这个包。: PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'C:WINDOWSTEMP/wordpress-4.
- 数据库安全·数据加密
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 常用字节转换(字符串转16进制,16进制转字符串)
- TensorFlow-手写数字识别(二)
- TensorFlow-手写数字识别(一)
- OpenCV-简易答题卡识别
- Flink 原理详解
- FreeRTOS例程2-任务挂起恢复与使用中断遇到的坑!
- Puppeteer自动化的性能优化与执行速度提升
- PyTorch1: 张量的性质
- 分治算法
- 基于 Nginx + PHP-FPM 作为 HTTP 服务器
- 玩转 PhpStorm 系列(五):代码模板篇
- 通过 PDO 扩展与 MySQL 数据库交互(上)
- 通过 PDO 扩展与 MySQL 数据库交互(下)
- 使用 Vue 3.0,你可能不再需要Vuex了
- 浅析小程序云原生数据库设计与应用