1. 程式人生 > 其它 >JS根據佔比計算名次範圍

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