JS根据占比计算名次范围
以下面为例:
根据(总数和占比)可以很简单的计算出来对应等级的总数;
思路:
名次的计算相当于计算开始名次和结束名次
等级人数(totalNum)=总人数(companyNumber)*占比(proportion)
开始名次(startRank)= 该等级之前的所有等级人数总和+1
结束名次(endRank)=开始名次(startRank)+等级人数(totalNum)-1
注意:如果依次从上往下计算直接算就行,但是场景中涉及到先填写下面的等级,然后再填上面的等级,或则填写以后再去掉的情况。
解决方案:占比添加blur事件,每次失去焦点以后,计算所有的等级名次,而不是只计算该占比对应的名次
代码实现:
import { sumBy, slice } from 'lodash'
用到了lodash的两个函数
_.sumBy类似_.sum方法,区别是传入一个iteratee方法在遍历数组的时候对每个元素调用以生成要被计算加和的值;
_.slice(array, [start=0], [end=array.length])
裁剪数组array,从 start 位置开始到end结束,但不包括 end 本身的位置。
computeRanking() { // 每次都计算整个数组的的名次 //ruleList为表格中的数据 ruleList.forEach((rule, index) => { if (rule.proportion) { //四舍五入,计算所有等级的人数 rule.totalNum = Math.round((this.companyNumber * rule.proportion) / 100) } else { rule.totalNum = 0 } if (rule.totalNum) { rule.startRank = sumBy(slice(ruleList, 0, index), function(o) { return o.totalNum }) + 1 rule.endRank = rule.startRank + rule.totalNum - 1 rule.ranking = rule.startRank + '-' + rule.endRank } else { rule.startRank = '' rule.endRank = '' rule.ranking = '' } }) this.$forceUpdate() },