做为搬砖在第一线的底层工人,业务场景历来是没有作不到只有想不到的复杂。
不过他强任他强,if-else全搞定,搬就完了。可是随着业务迭代或者项目交接,本身在看本身或者别人的if代码的时候,心情就再也不表述了,各自深有体会。因此咱们一块儿看看if还能怎么写es6
假设有这么个场景,不一样状况下打印不一样值。由于涉及到的条件太多,就不提三目运算之类优化了。segmentfault
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') }
如今还算能看,由于逻辑简单,若是逻辑复杂,迭代多个版本以后,你还敢动吗。
每动一下就战战兢兢,谁知道哪里会遗漏。那么换种方式呢数组
这样稍微清晰那么一点,差异好像没什么差异:数据结构
switch(a) { case 1:console.log('a1'); break; case 40:console.log('a40'); break; }
定义一个object做为配置对象来存放不一样状态,经过链表查找函数
const statusMap = { 1:()=>{ console.log('a1') }, 2:()=>{ console.log('b2') } } // 执行 let a = 1 statusMap[a || 1]()
这样比较清晰,将条件配置与具体执行分离。若是要增长其余状态,只修改配置对象便可。post
固然在某些状态下可使用数组,来作这个配置对象。优化
// 它就是个function,内容很复杂spa
const statusArr = [function(){ console.log(1) }, function () { console.log(2) },] let a = 1 statusArr[a || 1]()
数组的要求更高一点,若是是其余key,例如字符串,那么数组就不能知足需求了code
这样看起来好一点了,那么需求又有变更了,
前面是每种处理方式都不一样,下面有几种状况下处理函数相同的, 例如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 = 2 statusMap[a]()
这样固然也能够,不太重复写那么多f1,代码看起来不够简洁。
开始重构以前咱们先捋一下思路,无非是想把多个key合并起来,对应一个value。
也就是说咱们的键值不是字符串而是个数组,object显然只支持字符串, 那么能够将这么多key合并成一个:'1,2,3,4,..,9'。
可是查找的时候有点问题了,咱们的参数确定不能彻底匹配。
接着走下去,是否是作个遍历加个判断,包含在子集内的都算匹配,那么代码看起来就是下面这个样子。
const statusMap = { '1,2,3,4,5': f1, 40: f2 } const keys = Object.keys(statusMap), len = keys.length const getVal = (param='') => { for (let i = 0; i < len; i++) { const key = keys[i], val = statusMap[key] if (key.includes(param)) { return val } } } let a = 2, handle = getVal(a) handle()
可是这样来看,增长了个遍历的过程,并且是拼接字符串,万一哪天传了个逗号进来,会获得了预料以外的结果。
es6有个新的数据结构Map,支持任意数据结构做为键值。若是用Map可能更清晰一点。
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 = 2 getVal(a) handle()
我的而言虽然这样减小了重复代码,可是又增长了一步匹配值的操做,优劣就见仁见智吧。
确定有部分人就是不想作遍历的操做,既然一个数组不能知足,那么两个数组呢。
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://juejin.im/post/5c3607...
THE END
感谢阅读