只会if-else和switch?多层逻辑判断的优雅写法

简介: 只会if-else和switch?多层逻辑判断的优雅写法

逻辑判断之入门——If else

const run = (key: number) => {
    if(key === 1){
        console.log('1')
    }else if(key === 2){
        console.log('2')
    }else{
        console.log('3')
    }
}
复制代码

逻辑判断之入门——Switch

const run = (key: number) => {
    switch(key){
        case 1:
            console.log('1');
            break;
        case 2:
            console.log('2');
            break;
        case 3:
            console.log('3');
            break;
        default:
            break;
    }
}
复制代码

逻辑判断之进阶——单一判断、Switch与Map

const map = new Map([
    [1, ()=> {console.log('1')}],
    [2, ()=> {console.log('2')}],
    [3, ()=> {console.log('3')}]
])
const run = (key: number) => {
    const func = map.get(key);
    if(!func) return;
    func();
}
复制代码

逻辑判断之高级——多层判断、Switch与Map

背景:上述的🌰 都是基于单层判断的,下面给出一个多层判断的🌰 :

const run = (key: number, status: string) => {
    if(key === 1){
        switch(status){
            case 'success':
                console.log('key: 1, status: success');
                break;
            case 'fail':
                console.log('key: 1, status: fail');
                break;
        }
    }else if(key === 2){
        switch(status){
            case 'success':
                console.log('key: 2, status: success');
                break;
            case 'fail':
                console.log('key: 2, status: fail');
                break;
        }
    }
}
复制代码

下面进行优化:

使用Map优化

const func = (key: number, status: string) => {
    console.log(`key: ${key}, status: ${status}`);
}
const map = new Map([
    [{key: 1, status: 'success']: ()=> func(1, 'success'),
    [{key: 2, status: 'success']: ()=> func(2, 'success'),
    [{key: 1, status: 'fail']: ()=> func(1, 'fail'),
    [{key: 2, status: 'fail']: ()=> func(2, 'fail')
])
const run = (key: number, status: string) => {
    let cur = Array.from(map).find(item=>item[0].key === number && item[0].status===status);
    if(cur && cur[1]){
        cur[1].call(this);
    }
}
复制代码

缺点:如果有10种key,20种status,那么在map里需要写200个逻辑。

使用正则表达式

const func = (key: number, status: string) => {
    console.log(`key: ${key}, status: ${status}`);
}
const map = new Map([
    [/^success_[1-4]$/]: ()=> func(key, 'success'),
    [/^success_.*$/]: ()=> func(key, 'success'),
])
const run = (key: number, status: string) => {
    let cur = Array.from(map).find(item=>item[0].test(`${status}_${number}`));
    if(cur && cur[1]){
        cur[1].call(this);
    }
}
复制代码

这里使用了正则表达式来作为key,这也是为什么要用map而不是object的原因。

逻辑判断之高级——多层判断、策略模式

avascript设计模式之策略模式

策略模式的定义:定义一系列的算法,独立进行封装,并使他们可以相互替换。

下面举个例子:

const run = (key: number, status: string) => {
    if(key === 1){
        switch(status){
            case 'success':
                console.log('key: 1, status: success');
                break;
            case 'fail':
                console.log('key: 1, status: fail');
                break;
        }
    }else if(key === 2){
        switch(status){
            case 'success':
                console.log('key: 2, status: success');
                break;
            case 'fail':
                console.log('key: 2, status: fail');
                break;
        }
    }
}
// 下面使用组合函数进行一些优化:将各种算法进行了封装,但后续更改不太灵活
const getSuccessStatusText = (key: number) => {
    return `key: ${key}, status: success`
}
const getFailStatusText = (key: number) => {
    return `key: ${key}, status: fail`
}
const run = (key: number, status: string) => {
    if(status === 'success'){
        console.log(getSuccessStatusText(key))
    }else if(status === 'fail'){
        console.log(getSuccessStatusText(key))
    }
}
run(1, 'success')
// 下面使用策略模式
const statusAction = {
    "success": function(key: number)=>{
       return `key: ${key}, status: success`
    },
    "fail": function(key: number)=>{
       return `key: ${key}, status: fail`
    }
}
const run = (key: number, status: string) => {
    console.log(statusAction[status](key))
}
run(1, 'success')
复制代码

总结

  • 单层判断时,使用Switch,可以根据自己喜好加入Map
  • 多层判断时,使用Switch+Map+正则表达式,策略模式



相关文章
|
iOS开发 开发者
📝 App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
在iOS应用程序开发过程中,进行App备案并获取公钥及证书SHA-1指纹是至关重要的步骤。本文将介绍如何通过appuploader工具获取iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹,帮助开发者更好地理解和应用该过程。
|
5月前
|
人工智能 前端开发 机器人
10+热门 AI Agent 框架深度解析:谁更适合你的项目?
一个合适的 Agent 框架,决定了你AI应用落地的速度与质量。选框架 ≠ 选最火! 真正能跑起来、跑得稳、跑得远的 Agent 框架,才是你的最优解。
什么是死信交换机 ? 如何为队列绑定死信交换机 ?
死 信交换机和正常的交换机没有什么不同 , 如果一个包含死信的队列配置了dead-letter-exchange属性,指定了一个交换机,那么队列中的死信就会投递到这个交换机中,而这个交换机称为死信交换机 为队列绑定死信交换机 , 只需要设置队列属性 dead-letter-exchange即可
|
JavaScript
如何在 Vue 中使用具名插槽
【10月更文挑战第25天】通过使用具名插槽,你可以更好地组织和定制组件的模板结构,使组件更具灵活性和可复用性。同时,具名插槽也有助于提高代码的可读性和可维护性。
314 2
|
SQL Oracle 关系型数据库
Hive中的DECIMAL类型
Hive中的DECIMAL类型
785 1
|
机器学习/深度学习 数据采集 算法
机器学习:升维(Polynomial Regression)
该文介绍了升维的概念,指出在低维度中难以对混合数据进行有效分类,而升维是通过算法将数据投射到高维空间以改善模型性能。文章以多项式回归为例,说明了如何通过升维将非线性关系转换为线性关系,并提供了Python代码示例展示了如何使用`PolynomialFeatures`进行升维。代码结果显示,随着维度增加,模型从欠拟合逐渐过渡到过拟合。
1621 0
|
SQL Java 数据库连接
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
Mybatis查询的时候BigDecimal类型的值查询失效的解决办法
|
存储 关系型数据库 MySQL
MySQL分区的优缺点
数据库中分区是将表或索引的数据划分成更小、更可管理的部分的一种技术。这些部分被称为分区,每个分区可以独立地进行维护和管理。
902 0
|
IDE 开发工具 开发者
Qt-Qt Creator的下载、安装与配置(Windows)
Qt-Qt Creator的下载、安装与配置(Windows)
7459 1
|
前端开发 JavaScript 程序员
【面试题】 经典但依然超难做的 前端面试题 (值得收藏)
【面试题】 经典但依然超难做的 前端面试题 (值得收藏)
311 0

热门文章

最新文章