纯牛奶645
纯牛奶645
  • 发布:2018-02-02 15:24
  • 更新:2018-02-02 15:24
  • 阅读:1824

三元表达式的妙用

分类:Native.js

这次遇到了这样的需求:考试成绩的总分为40分,计算的时候分为5个段,30-40权重为20,20-29权重为15,10-19权重为10,1-9权重为5,依次递减, 0分为0.
分析:每个段在计算的时候递减5。临界值的判断。每次计算的区间为10.
第一步:用Math.floor的方法,当成绩在31-40之间的时候Math.floor的计算结果为0,在21-30之间的时候Math.floor的计算结果为1,在11-20之间的时候Math.floor的计算结果为2,在1-10之间的计算结果为3。方法如下

Math.floor((40 - score) / 10)

第二步:总权重20,每个段减5

20 - (Math.floor((40 - score) /10) * 5);

这样好像“完美”的解决了问题,但还有些临界值遗漏,我们继续。
第三步:当score为30时候,权重应该为20,但根据上面的方法,我们计算的结果为15,因此当遇到score为30、20、10的时候我们需要将权重增加5。方法如下:

20 - (Math.floor((40-score)/10)*5)+ 5;

可也以写成

25 - (Math.floor((40 - score) / 10) * 5);

第三步:解决了临界值,需要根据不同的条件来选择不同的计算方法,当(40 - score)/ 10 为整数时用25 - (Math.floor((40 - score) / 10) 5);来计算,否则用 20 - (Math.floor((40 - score) /10) 5); 来计算。方法如下:
根据正则来判断是否为正整数

/^[0-9]*[1-9][0-9]*$/.test(( 40 -score ) / 10 ) ? 25 - Math.floor((40 - score) / 10 )* 5  :  20 - Math.floor((40 - score) / 10 ) * 5

第四步:好像已经可以满足需求了,但是我们把成绩为0的情况遗漏了,最后一步

score == 0 ?0 :(/^[0-9]*[1-9][0-9]*$/.test(( 40 -score ) / 10 ) ? 25 - Math.floor((40 - score) / 10 )* 5  :  20 - Math.floor((40 - score) / 10 ) * 5);

这样就用三元表达式一行代码解决了我们的需求。

var leval = score == 0 ?0 :(/^[0-9]*[1-9][0-9]*$/.test(( 40 -score ) / 10 ) ? 25 - Math.floor((40 - score) / 10 )* 5  :  20 - Math.floor((40 - score) / 10 ) * 5);

考试成绩的总分为40分,成绩为30-40权重为20,成绩为20-29权重为15,成绩为10-19权重为10,成绩为1-9权重为5,依次递减, 0分为0.

大神提供了一种更为简单的写法,这种写法比较适合在分段比较少的情况下使用:

score>0?score>9?score>19?score>29?20:15:10:5:0;  
也可以写成  
score>0?(score>9?(score>19?(score>29?20:15):10):5):0;

不足之处请指正!

0 关注 分享

要回复文章请先登录注册

纯牛奶645

纯牛奶645 (作者)

回复 回梦無痕 :
哈哈 多谢指点
2018-02-06 09:48
回梦無痕

回梦無痕

var leval = score>0?score>9?score>19?score>29?20:15:10:5:0;
短小直观。。。。
2018-02-03 14:12
纯牛奶645

纯牛奶645 (作者)

回复 2***@qq.com :
哈哈哈 我就喜欢你这样的键盘侠
2018-02-02 21:17
2***@qq.com

2***@qq.com

就是根据逻辑值来返回,2个不同的结果,这都不知道,说明你们2个都没入门
2018-02-02 16:17
王者地带

王者地带

?? 怎么妙用?
2018-02-02 15:40