JS根據佔比計算名次範圍
阿新 • • 發佈:2021-12-02
以下面為例:
根據(總數和佔比)可以很簡單的計算出來對應等級的總數;
思路:
名次的計算相當於計算開始名次和結束名次
等級人數(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() },