思想:
1. 所有的百分比取整数部分
2. 将所有百分比相加,最理想状态是100%,但相信大部分是小于100%的,取差值
3. 数组按小数部分排序
4. 从小数最大的那个百分比开始加一,直到补全所有的差值
下面这个图说的很清楚了,图是我从百度过来的
实现:
我把它封装成了方法
/*
** ary 要处理的数据的数组集合
** field 要求百分比的字段
** total 总数
*/
vm.formatRatio = function (ary, field, total) {
if (!Array.isArray(ary)) {
return;
}
var sum = 0;
//思想 向下取整,然后按余数的大小排序,和100的差值从上到下加1,直到差值补上
ary.forEach(function (item) {
//整数部分
item.formatRatio = parseInt(_.get(item, field) * 100 / total);
item.formatInt = parseInt(_.get(item, field) * 100 / total);
sum += item.formatInt;
//小数部分
item.formatDot = _.get(item, field) * 100 / total - item.formatInt;
})
var diff = 100 - sum;
if (diff) {
//按余数排序
ary = _.sortBy(ary, ['formatDot']);
for (var i = ary.length - 1; i >= 0; i--) {
if (diff == 0) continue;
++ary[i].formatRatio;
--diff;
}
}
//处理0%的数据,不显示0%,显示小于1%
ary.forEach(function (item) {
if (item.formatRatio == 0) {
item.formatRatio = '小于 1'
}
})
//从大到小排序
ary = _.sortBy(ary, ['formatRatio']).reverse();
return ary
}
有写的不清楚的地方可以留言问我,感谢图中网友给的思路