作者:潇湘待雨
链接:https://www.cnblogs.com/pqjwyn/p/10247336.html

前言

作为搬砖在第一线的底层工人,业务场景从来是没有做不到只有想不到的复杂。

不过他强任他强,if-else全搞定,搬就完了。但是随着业务迭代或者项目交接,自己在看自己或者别人的if代码的时候,心情就不再表述了,各自深有体会。所以我们一起看看if还能怎么写

最基本if-else

假设有这么个场景,不同情况下打印不同值。 因为涉及到的条件太多,就不提三目运算之类优化了。

if (a == 1) {    console.log('a1')} else if (a == 2) {    console.log('b2')} else if (a == 3) {    console.log('c3')} else if (a == 4) {    console.log('d4')}/* n..... */

现在还算能看,因为逻辑简单,如果逻辑复杂,迭代多个版本之后,你还敢动吗。

每动一下就战战兢兢,谁知道哪里会遗漏。 那么换种方式呢

switch-case

这样稍微清晰那么一点,差别好像没什么差别:

switch(a){    case 1:        console.log('a1');        break;    /* 省略。。。 */      case 40:        console.log('a40');        break;}

分离配置信息与执行动作

object映射

定义一个object作为配置对象来存放不同状态,通过链表查找

const statusMap = {    1:()=>{        console.log('a1')    },    2:()=>{        console.log('b2')    }    /* n.... */}// 执行let a = 1 statusMap[a || 1]()

这样比较清晰,将条件配置与具体执行分离。如果要增加其他状态,只修改配置对象即可。

数组映射

当然在某些状态下可以使用数组,来做这个配置对象。

// 这里就涉及其他优化了,例如将执行函数抽离出来,大家不要关注func的内容就好。// 它就是个function,内容很复杂const statusArr = [function(){    console.log(1)},    function () {        console.log(2)    },]// 执行let a = 1statusArr[a || 1]()

数组的要求更高一点,如果是其他key,例如字符串,那么数组就不能满足需求了

升级版:不同key相同value

这样看起来好一点了,那么需求又有变动了,

前面是每种处理方式都不同,下面有几种情况下处理函数相同的, 例如1-39的时候,调用a,40之后调用b,如果我们继续来用映射的方式来处理。

function f1 (){    console.log(1)}function f2 (){    console.log(2)}const statusMap={    1:f1,    2:f1,    3:f1,    4:f1,    //省略    40:f2}let a = 2statusMap[a]()

这样当然也可以,不过重复写那么多f1,代码看起来不够简洁。

开始重构之前我们先捋一下思路,无非是想把多个key合并起来,对应一个value。

也就是说我们的键值不是字符串而是个数组,object显然只支持字符串, 那么可以将这么多key合并成一个:'1,2,3,4,..,9'。

但是查找的时候有点问题了,我们的参数肯定不能完全匹配。

接着走下去,是不是做个遍历加个判断,包含在子集内的都算匹配,那么代码看起来就是下面这个样子。

// 将键值key设置为一个拼接之后的字符串const statusMap = {    '1,2,3,4,5': f1,    //省略    40: f2}// 获取所有的键值,待会遍历用const keys = Object.keys(statusMap),    len = keys.length// 遍历获取对应的值 const getVal=(param='')=>{    // 用for循环的原因在于匹配之后就不需要继续遍历    for (let i = 0; i         const key = keys[i],            val = statusMap[key]        // 这里用什么来判断就随便了,两个字符串都有。            if (key.includes(param)) {            return val        }    }}let a = 2,    handle = getVal(a)handle() // 1

但是这样来看,增加了个遍历的过程,而且是拼接字符串,万一哪天传了个逗号进来,会得到了预料之外的结果。

map

es6有个新的数据结构Map,支持任意数据结构作为键值。如果用Map可能更清晰一点。

/** * map键值索引的是引用地址, * 如果是下面这样的写法不好意思,永远得不到值 * map1.set([1,4,5],'引用地址') * map1.get([1,4,5])  //输出为undefined * 就像直接访问 * map1.get([1,2,3,4,5]) //同样为undefined */const map1 = new Map()const statusArr = [1,2,3,4,5]map1.set(statusArr,f1)// 预设默认值,因为不能直接遍历let handle = function(){}const getVal = (param = '') => {for (let value of map1.entries()) {    console.log(JSON.stringify(value))    if (value[0].includes(param)){        console.log(value)        // 不能跳出 只能处理了        handle = value[1]    }}}const a = 2getVal(a)handle()

个人而言虽然这样减少了重复代码,但是又增加了一步匹配值的操作,优劣就见仁见智吧。

双数组

肯定有部分人就是不想做遍历的操作,既然一个数组不能满足,那么两个数组呢。

// 键值数组和value 保持对应关系const keyArr = ['1,2,3,4,5','40']const valArr = [f1,f2]const getVal = (param = '')=>{    // 查找参数对应的下标    let index = keyArr.findIndex((it)=>{        return it.includes(param)    })    // 获取对应值    return valArr[index]}let a = 2,    handle = getVal(a)handle()

利用数组提供的下标,将key和value对应起来,进而获取想要的值。

这里一直没有达到我最初的目的,即键里面重复的数组,可以不通过多余操作匹配到,上面不管怎么样都进行了处理,这不是懒人的想要的。

总结

这是在写业务需求的时候做的一点总结,数组和对象的映射可能大家都在用。当遇到了不同key相同value的情况时,从懒出发不像重复罗列,就尝试了下。当然了,因为个人水平问题,肯定有更好的处理方式,欢迎一起讨论,抛砖引玉共同进步。此外现有成熟的库里loadsh也是可以到达目的,不过自己思考过之后再去看大神的作品理解会更深入一点。更多文章请转我的博客(https://github.com/xiaoxiangdaiyu/blog)


●编号877,输入编号直达本文

●输入m获取文章目录

推荐↓↓↓

Web开发

更多推荐25个技术类微信公众号

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。

c++ switch 字符串参数_其实我们可以少写点if else和switch相关推荐

  1. 贝叶斯优化神经网络参数_贝叶斯超参数优化:神经网络,TensorFlow,相预测示例

    贝叶斯优化神经网络参数 The purpose of this work is to optimize the neural network model hyper-parameters to est ...

  2. switch字符串jdk_应用新的JDK 11字符串方法

    switch字符串jdk 在" 使用JDK 11的Java字符串上的新方法 "和" String#repeat即将加入Java? ",我讨论了JDK 11引入J ...

  3. hsweb提取页面查询参数_爬虫入门二-提取信息-正则表达式

    Hello,好久没更新了,因为我苦逼的去准备期中考试了,哎,不提了,进入我们今天的正题,提取网页中的信息吧. 上次,我们学会了如何向网站提交一个请求并得到返回的信息. 那么我们如何在这一大串信息中提取 ...

  4. 关于switch的参数类型

    关于switch的参数类型 switch(expr1)中,expr1是一个整数表达式,整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int ...

  5. Switch 中参数的范围探讨

    switch 语句必须遵循下面的规则: switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举 ...

  6. Java中switch的参数类型

    概述 在jdk1.7以下版本,switch的参数类型只能是:int 或者 enum,在jdk1.7及以上版本,参数可以为String类型!!! 当因为版本低,switch功能不支持字符串作为条件.这时 ...

  7. C++ 中的switch函数参数类型

    C++ 中的switch函数参数类型 switch (exp1)中, exp1 是一个整数表达式,整数表达式可以是int基本类型或Integer包装类型,由于, byte,short,char都可以隐 ...

  8. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...

    面试题集共分为以下十部分: 一.Core Java: 1 - 95 题1 - 24 页 基础及语法: 1 - 61 题1 - 13 页 异常: 62 - 69 题13 - 15 页 集合: 70 - ...

  9. java 字符码查询_Java URL查询字符串参数的编码

    URLEncoder应该是走的路.您只需要记住,只编码单个查询字符串参数名称和/或值,而不是整个URL,确保不要查询字符串参数分隔符字符&也不是参数名称 – 值分隔符字符=. String q ...

最新文章

  1. 性能超越图神经网络,将标签传递和简单模型结合实现SOTA
  2. hackerrank---Sets - Symmetric Difference
  3. Git打标签(Tag)(亲测)
  4. Apache Ivy
  5. 计网 --- 域名服务系统:因特网的目录服务
  6. 新CIO:Mark Schwartz认为的领先IT
  7. Angular的后院:组件依赖关系的解决
  8. mysql缓存淘汰机制_聊聊缓存淘汰算法-LRU 实现原理
  9. mysql 表增加多个索引_mysql给同一个表添加多个索引的测试
  10. DirectDraw 学习:
  11. C++ 数组动态分配
  12. elasticsearch搜索引擎搭建
  13. Microsoft兼容性遥测是什么?Microsoft兼容性遥测占用高磁盘
  14. 计算机怎么进入待机模式,电脑怎么进入待机模式
  15. Kingofark的人工智能启示录
  16. 【水滴石穿】ES must与should组合使用的正确方式
  17. 小程序源码:2022虎年全新头像框制作
  18. java面试的一些流程问题
  19. 高防CDN在防御DDoS攻击中必不可少?简析高防CDN针对防御DDoS攻击的可行方案
  20. 基于pgrouting求任意两点的最短路径的函数pgr_fromAtoB

热门文章

  1. NLP简报(Issue#1)
  2. rust怎么传送到队友_王者荣耀原初法阵怎么传送?原初法阵最多传送几个人?...
  3. linux性能测试cpu内存io,Linux下磁盘IO性能测试工具介绍
  4. CCF 2013-12-2 ISBN号码
  5. CVPR2022车道线检测Efficient Lane Detection via Curve Modeling
  6. Linux编程(6)_makefile
  7. 第五:Pytest之收集用例规则与运行指定用例
  8. mysql 表 组织 管理_MySQL 基础知识梳理学习(二)----记录在页面层级的组织管理...
  9. vb net excel 剪贴板 粘贴_利用剪贴板强化 Excel 计算
  10. Node.js运行模式与应用组成部分