Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

代替 if-else 的姿势(二) #9

Open
chenhuiYj opened this issue Jun 3, 2020 · 0 comments
Open

代替 if-else 的姿势(二) #9

chenhuiYj opened this issue Jun 3, 2020 · 0 comments

Comments

@chenhuiYj
Copy link
Owner

chenhuiYj commented Jun 3, 2020

1.范围查询

比如判一个值是否在9-12或者14-18里面
之前做法是

let num1= 15
let num2= 13
if((num1>=9&&num1<=12)||(num1>=14&&num1<=18)){
     // 数字在范围内
}
if((num2>=9&&num2<=12)||(num2>=14&&num2<=18)){
     // 数字在范围内
}

现在可以用some 进行封装一下

function handleCheckRange(num, ...ranges){
    return ranges.some(item=>num>=item[0]&&num<=item[1])
}
handleCheckRange(num1,[9,12],[14,18]) //true
handleCheckRange(num2,[9,12],[14,18]) //false

这样写貌似没什么问题,如果以后时间变了,或者又有其他需求,还是要这样写一下,

2.多条件查询

相信大家都会遇到可能会有多个条件组合的问题

比如有一个参与热卖活动赠积分活动,活动状态(status),预热中(status=1),进行中(status=2)。用户类型(type)也有分普通用户(type=1)vip用户(type=2)

规则是:
1.在预热中参与活动,vip用户赠送1000积分,普通用户赠送700积分。
1.在进行中参与活动,vip用户赠送800积分,普通用户赠送300积分。

之前写法是

let status=1
let type=2
if(status===1){
     if(type===1){
           console.log('普通用户在预售中参与活动,赠送700积分')
    }
    else if(type===2){
           console.log('vip用户在预售中参与活动,赠送1000积分')
    }
}
else if(status===2){
     if(type===1){
           console.log('普通用户在进行中参与活动,赠送300积分')
    }
    else if(type===2){
           console.log('vip用户在进行中参与活动,赠送800积分')
    }
}

// 或者

if(status===1&&type===1){
    console.log('普通用户在预售中参与活动,赠送700积分')
}
else if(status===1&&type===2){
    console.log('vip用户在预售中参与活动,赠送1000积分')
}
else if(status===2&&type===1){
    console.log('普通用户在进行中参与活动,赠送300积分')
}
else if(status===2&&type===2){
    console.log('vip用户在进行中参与活动,赠送800积分')
}

但是现在可以使用 obj写法

let obj={
   'status=1&type=1':'普通用户在预售中参与活动,赠送700积分',
   'status=1&type=2':'vip用户在预售中参与活动,赠送1000积分',
   'status=2&type=1':'普通用户在进行中参与活动,赠送300积分',
   'status=2&type=2':'普通用户在进行中参与活动,赠送800积分'
}

console.log(obj[status=${status}&type=${type}])

多个或条件

比如输如一个城市名字,输出一个省份名称

let city='广州'
if(city==='广州'||city==='佛山'){
    console.log('广东')
}
else if(city==='海口'||city==='三亚'){
    console.log('海南')
}

这样写的弊端就是,如果if-else 数量一多,代码就会多,而且判断的条件会变得很长,还有一个问题就是风格有可能不会统一

下面用其他方法进行优化下
方法一

let arr=[
    {
        city:'广州',
        province:'广东'
    },
    {
        city:'佛山',
        province:'广东'
    },
    {
        city:'海口',
        province:'海南'
    },
    {
        city:'三亚',
        province:'海南'
    }
]
console.log(arr.filter(item=>item.city===city)[0].province)//广东

方法二

方式一
let city='广州'
let obj={
    '广州':'广东',
    '佛山':'广东',
    '海口':'海南',
    '三亚':'海南',
}
console.log(obj[city])// 广东

// 方式二------------------------------------
let obj={
    '广州,佛山':'广东',
    '海口,三亚':'海南',
}
for(let key in obj){
    if(key.includes(city)){
        console.log(obj[key])
        break
    }
}
//广东


//这个方法是有bug的,比如
city='州'
for(let key in obj){
    if(key.includes(city)){
        console.log(obj[key])
        break
    }
}
// 广东
// 解决这个问题很简单,可以使用Map
city='广州'
let map=new Map([
     [['广州','佛山'],'广东'],
     [['海口','三亚'],'海南'],
])
for (let key of map.keys()) {
  if(key.includes(city)){
        console.log(obj[key])
        break
    }
}
//广东

参考链接

[浅析]特定场景下取代if-else和switch的方案
JavaScript 复杂判断的更优雅写法

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant