
本文介绍一种基于权重百分比的公平分配算法,可将一组物品按预设比例精确分配至多个目标对象,适用于负载均衡、资源调度等场景。
本文介绍一种基于权重百分比的公平分配算法,可将一组物品按预设比例精确分配至多个目标对象,适用于负载均衡、资源调度等场景。
在实际开发中,我们常需根据配置的权重(如分配百分比)将一批物品(如任务、数据、用户请求)分发到多个处理单元(如服务实例、存储桶或业务对象)。关键要求是:分配结果必须严格符合各对象的百分比权重,且总分配数等于物品总数,避免遗漏或重复。
以下是一个简洁、健壮的实现方案:
✅ 核心思路:累积偏移 + 截取切片
我们不逐个遍历物品进行“轮询式”分配,而是预先计算每个对象应得的物品数量(向下取整),再通过数组 slice() 按连续区间高效截取对应子集。该方法时间复杂度为 O(n),无浮点误差累积,且天然保持物品原始顺序。
const items = ["item1", "item2", "item3", "item4", "item5"];
const obj1 = { id: 1, allocationPercentage: 40, items: [] };
const obj2 = { id: 2, allocationPercentage: 20, items: [] };
const obj3 = { id: 3, allocationPercentage: 40, items: [] };
const objs = [obj1, obj2, obj3];
let cursor = 0;
for (const obj of objs) {
// 计算该对象应分配的数量(向下取整,确保整数)
const count = Math.floor((obj.allocationPercentage / 100) * items.length);
// 从 items 中截取 [cursor, cursor + count) 区间的元素
const itemsToAdd = items.slice(cursor, cursor + count);
// 批量推入(注意:push(...itemsToAdd) 展开数组,而非嵌套)
obj.items.push(...itemsToAdd);
cursor += count;
}
console.log(objs);
// 输出:
// [
// { id: 1, allocationPercentage: 40, items: ["item1", "item2"] },
// { id: 2, allocationPercentage: 20, items: ["item3"] },
// { id: 3, allocationPercentage: 40, items: ["item4", "item5"] }
// ]
⚠️ 注意事项与优化建议
- 百分比校验:生产环境建议先校验 objs 中所有 allocationPercentage 总和是否为 100(允许 ±0.01 浮点容差),否则逻辑可能失准;
- 余数处理:当 Math.floor 导致总分配数
- 不可变设计(推荐):若需函数式编程风格,可返回新对象而非修改原对象,避免副作用;
- 动态扩展支持:该算法天然支持任意数量的对象和任意合法百分比组合,无需硬编码分支。
此方案兼顾准确性、性能与可维护性,是资源按权重分配的经典实践。











