这次遇到了这样的需求:考试成绩的总分为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;
不足之处请指正!
5 个评论
要回复文章请先登录或注册
纯牛奶645 (作者)
回梦無痕
纯牛奶645 (作者)
2***@qq.com
王者地带