只会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+正则表达式,策略模式



相关文章
|
7月前
|
Python
循环的嵌套
在编程中,循环结构是一种非常重要的控制结构,用于重复执行一段代码。而循环的嵌套则是指在一个循环内部又包含了另一个或多个循环,使得代码的执行更加复杂和灵活。本文将介绍循环嵌套的概念、使用场景以及示例代码。
115 1
|
3月前
|
前端开发 JavaScript
前端基础(六)_流程控制语句(if、if-else、if-else嵌套、switch)
本文介绍了JavaScript中的流程控制语句,包括if、if-else、if-else嵌套和switch语句。
32 2
前端基础(六)_流程控制语句(if、if-else、if-else嵌套、switch)
|
3月前
|
Java Spring
巧用switch-case消除条件判断
`shigen`是一位致力于撰写博客文章的作者,通过记录成长历程、分享见解并留住感动瞬间。在其文章中,`shigen`介绍了多种消除if-else代码的方法,包括使用HashMap、枚举以及switch-case。最新示例展示了如何通过简洁的switch-case语句处理不同类型的请求,代码优雅且直观。此外,还预告了下一章节将探讨如何利用Spring框架的IOC能力来进一步优化条件判断。与`shigen`一起探索编程世界的每一天都充满新意!**个人IP:shigen**
40 0
巧用switch-case消除条件判断
|
5月前
|
语音技术 数据安全/隐私保护
语音识别,猜猜心里数字讲解,猜数字的组合,判断语句的嵌套,嵌套语句使用很简单,我们写一个外层嵌套的条件,利用缩进,满足条件,才会执行条件2,判断语句综合案例,如何产生变量的随机数字,while循环应用
语音识别,猜猜心里数字讲解,猜数字的组合,判断语句的嵌套,嵌套语句使用很简单,我们写一个外层嵌套的条件,利用缩进,满足条件,才会执行条件2,判断语句综合案例,如何产生变量的随机数字,while循环应用
|
7月前
|
C++
C++语言中Switch语句循环和作用类型
C++语言中Switch语句循环和作用类型
93 0
|
7月前
|
C++ 容器
C++语言中for语句循环和作用类型
C++语言中for语句循环和作用类型
114 0
|
7月前
C 语言中的 switch 语句和 while 循环详解
替代多重 if..else 语句,可以使用 switch 语句。switch 语句用于选择多个代码块中的一个来执行
110 0
|
7月前
|
存储 程序员 编译器
【新手解答5】深入探索 C 语言:宏中的文本、标识符和字符串 + 递归运算、条件语句、循环 + `switch-case` 与多项条件和枚举的差别
【新手解答5】深入探索 C 语言:宏中的文本、标识符和字符串 + 递归运算、条件语句、循环 + `switch-case` 与多项条件和枚举的差别
83 0
#PY小贴士# for 循环定义的变量,循环外可以用吗?
我们知道,在 python 中要获取一个变量的值,必须是先给它赋值过,不然就是未定义。那么这个 i,代码中没有显式的赋值,在循环体之外还可以用吗?
|
Python
巧用for循环嵌套结构
巧用for循环嵌套结构
102 0