去除字符串乱码和 不用循环给数组赋值 自有的时间调度器
一,用正则表达式来将字符串"I?���love�??�the�?great�?�?wall�in��?beijing"更改为:"I love the Great Wall in Beijing",主要是为了解决编码的问题导致的问题,规律:
1,乱码只有两种特殊字符分别是'?'和'�';
2,如果乱码的末尾是'?'则它的下一位字母肯定是大写;
let str = "I?���love�??�the�?great�?�?wall�in��?beijing"; str = str.replace(/�/g, ''); console.log(str); strArr = str.split('?'); for(var i=0;i<strArr.length;i++){ strArr[i] = strArr[i].charAt(0).toUpperCase()+strArr[i].slice(1); } strArr = strArr.join(' '); console.log(strArr);
二,不使用类似for,while循环控制语句和js本身自带方法(如:forEach)的情况下,实现将一个空数组[]赋值成[0,******************],范围0-100便可。
let arr = []; let num = 0; function addNum2Arr() { if (num<100) { arr.push(num); num += 4; addNum2Arr(); } } addNum2Arr(); console.log(arr) |
三,设计一个自由可灵活配置的时间调度器,有a,b,c,d...很多个需要被调度的方法(方法名称的命名可随意),调度有两种形式,一个是顺序调用(例如调度完a后才能调度b),一个是间隔某个时间进行循环调度。用一个统一的方法进行封装可以实现下列的例子:
1,可以为5秒后调用a,3秒后调用b,10秒后调用c,d...z方法不执行(不执行的方法可以设计成不传递参数),那么在第14秒的时候开始重新从0秒循环,又变成第一秒后调用a,3秒后调用b,这样循环往复;
2,每间隔6秒调用一次a,每间隔4秒调用一次b,c...z方法不执行;
3,第一秒先执行a,3秒后执行b,但是c却是每间隔3秒执行一次,d是每间隔4秒执行一次,a和b是每4秒进行一次循环;
4,a不执行,b和c每间隔3秒执行一次,d不执行;
class TimeScheduler { constructor() { this .events = []; this .orderCallStack = []; this .ownCallStack = []; } //添加执行栈函数,orderExec用于区别是顺序调用还是独立调用,注意同一个函数存在顺序调用和独立调用时需要add两次 add(fn = () => {}, orderExec = false , timeout = 3) { let fnc; if (orderExec) { fnc = () => { setTimeout(() => { fn(); this .next(); }, timeout * 1000) }; } else { fnc = () => { setInterval(() => { fn() }, timeout * 1000) }; } this .events.push({ fnc, orderExec }) } remove(fnc = () => {}) { this .events = this .events.filter(item => item.fnc === fnc); } clear() { //清除存储数据及清空调用栈 this .events = []; this .orderCallStack.forEach(item => { clearTimeout(item.fnc); }); this .ownCallStack.forEach(item => { clearInterval(item.fnc); }); this .ownCallStack = []; this .orderCallStack = []; } start() { //开始执行 this .orderCallStack = this .events.filter(item => !!item.orderExec); this .ownCallStack = this .events.filter(item => !item.orderExec); this .ownCallStack.forEach(item => item.fnc()); this .next(); } stop() { //停止执行 this .orderCallStack.forEach(item => { clearTimeout(item.fnc); }); this .ownCallStack.forEach(item => { clearInterval(item.fnc); }); this .ownCallStack = []; this .orderCallStack = []; } next() { //顺序调用栈执行函数 let obj = this .orderCallStack.shift() || {}; if (obj.fnc) { this .orderCallStack.push(obj); obj.fnc(); } } } let a = () => { console.log( "a" ); } let b = () => { console.log( "b" ); } let c = () => { console.log( "c" ); } const timeScheduler1 = new TimeScheduler(); timeScheduler1.add(a, true , 5); timeScheduler1.add(b, true , 3); timeScheduler1.add(c, true , 10); timeScheduler1.start(); |
参考 https://cloud.tencent.com/developer/article/1637007
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)