持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情
目录
今日题
题目
实现一个函数getMaxSubArr
找出数组中连续子数组的最大和并返回
const arr = [1, 3, -2, 4, 7, -9, 6]
const res = getMaxSubArr(arr)
console.log(res) //13
分析
- 可以用一个变量
firstValue
来保存数组的第一个元素,先默认它是最大的 - 在遍历数组时,用另一个变量
maxSum
保存当前遍历到的子数组的和 - 然后比较
maxSum
和firstValue
,得到最大值
昨日题
题目
实现一个类 名称:CallbackSavior 属性:自定义 方法:push,run
答案
class CallbackSavior {
all = []
upv = null
push(cb) {
this.all.push(cb)
}
async run() {
while(this.all.length) {
const cb = this.all.shift()
if(cb?.constructor === Function) {
this.upv = cb(this.upv)
} else if (cb?.constructor === Promise) {
this.upv = await cb
} else {
this.upv = cb
}
}
return this.upv
}
}
解析
- 在
CallbackSavior
中定义数组all
和保存上一个传入push
的回调的结果的upv
- 在实例
CallbackSavior
后,将push
接受的所有实参都推入all
数组中 - 由于
cbs.run
是一个async
的异步函数,所以可以调用then
方法
async run() {
while(this.all.length) {
const cb = this.all.shift()
if(cb?.constructor === Function) {
this.upv = cb(this.upv)
} else if (cb?.constructor === Promise) {
this.upv = await cb
} else {
this.upv = cb
}
}
return this.upv //(*)
}
- 在
run
中,我们以this.all.length
为条件,第一次进入时,由于我们通过cbs.push
添加了6个数据,所以其长度为6 - 然后每次都
shift
弹出一个之前推入数组的数据,用cb接收 - 之后对
cb
的类型进行判断 - 如果
cb
是Function
,就运行它,并将this.upv
传入, 同时用this.upv
来接收 - 如果它是
Promise
,则await
得到其结果,同样用this.upv
来接收 - 最后判断其为基础类型,则直接赋值给
this.upv
即可 - 而
(*)
处的返回this.upv
,是为了成功运行下面的代码
cbs.run().then(value => {
console.log(value); // ddd
});
- 将返回的
this.upv
当作实参传给value
,最后成功运行
结语
此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。创作不易,少年,就请留个赞再走吧!