格式化字符串-空数组赋值-时间调度器

39次阅读

共计 2681 个字符,预计需要花费 7 分钟才能阅读完成。

一、用正则表达式来将字符串 I?���love�??�the�?great�?�?wall�in��?beijing 更改为:I love the Great Wall in Beijing, 主要是为了解决编码的问题导致的问题, 规律:

  1. 乱码只有两种特殊字符分别是 ?;
  2. 如果乱码的末尾是 ? 则它的下一位字母肯定是大写;
 class stringReg {constructor(text) {
                this.text = text;
                this.init();}
            getString() {// 将符合规律 2 的单词首字母大写
                const regArr = this.text.match(/[\?][a-z]/g);
                for (let i = 0; i < regArr.length; i++) {this.text = this.text.replace(regArr[i], regArr[i][1].toUpperCase());
                }
            }
            trim() {// 将多个空格转化为单个空格
                this.text = this.text.replace(/\s\s*/g, ' ');
            }
            delSymbol() {// 将特殊符号全部转化为空格
                this.text = this.text.replace(/[\?\�]/g, ' ');
            }
            init() {this.getString();
                this.delSymbol();
                this.trim();}
        }
        const {text} = new stringReg("I?���love�??�the�?great�?�?wall�in��?beijing");
        console.log(text); //I love the Great Wall in Beijing

二、不使用类似 for,while 循环控制语句和 js 本身自带方法 (如:forEach) 的情况下, 实现将一个空数组 [] 赋值成 [0,2,4,6,8,*****************] 范围 0-100 便可。

// 递归思想
function evenNum(min = 0, max = 100, arr = []) {if (min % 2 === 0) {arr.push(min);
    }
    if (min === max) {return arr;}
    return evenNum(++min, max, arr);
}
console.log(evenNum(0, 6)); //[0, 2, 4, 6]

三、设计一个自由可灵活配置的时间调度器, 有 a,b,c,d... 很多个需要被调度的方法(方法名称的命名可随意), 调度有两种形式, 一个是顺序调用(例如调度完 a 后才能调度 b), 一个是间隔某个时间进行循环调度。用一个统一的方法进行封装可以实现下列的例子:

  1. 可以为 5 秒后调用 a,3 秒后调用 b,7 秒后调用 c。d…z 方法不执行(不执行的方法可以设计成不传递参数), 那么在第 14 秒的时候开始重新从 0 秒循环, 又变成 5 秒后调用 a,3 秒后调用 b,7 秒后调用 c,这样循环往复;
  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();}
    }
}

例 1 使用示例:

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, 7);
timeScheduler1.start();
console.log(timeScheduler1);

正文完
 0