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()
    },

 

posted @ 2021-12-02 10:25  轩悦  阅读(280)  评论(0编辑  收藏  举报