如何依据各对象的allocationPercentage将Items分配至对应对象?
按分配百分比分配Items的实现方案
核心思路
根据对象的allocationPercentage分配新增Items,核心是先计算每个对象应得的Items数量,再按数量将Items依次分配给对应对象,同时处理百分比计算后的取整误差,保证所有Items都被合理分配。
代码实现
// 定义需要分配的对象数组 const allocationObjects = [ {id: 1, allocationPercentage: 40, items: []}, {id: 2, allocationPercentage: 20, items: []}, {id: 3, allocationPercentage: 40, items: []} ]; // 分配函数:接收待分配的items数组,更新目标对象的items属性 function allocateItems(newItems) { // 先校验所有对象的百分比总和是否为100% const totalPercentage = allocationObjects.reduce((sum, obj) => sum + obj.allocationPercentage, 0); if (totalPercentage !== 100) { throw new Error('所有对象的分配百分比总和必须为100%'); } const totalItems = newItems.length; let remainingItems = [...newItems]; // 计算每个对象的基础分配数量 const allocations = allocationObjects.map(obj => { const count = Math.round((obj.allocationPercentage / 100) * totalItems); return { ...obj, count }; }); // 调整分配数量,解决四舍五入导致的总数偏差 let totalAllocated = allocations.reduce((sum, item) => sum + item.count, 0); let diff = totalItems - totalAllocated; while (diff !== 0) { // 按百分比高低调整数量,保证分配公平 const targetIndex = diff > 0 ? allocations.findIndex(obj => obj.allocationPercentage === Math.max(...allocations.map(o => o.allocationPercentage))) : allocations.findIndex(obj => obj.allocationPercentage === Math.min(...allocations.map(o => o.allocationPercentage))); allocations[targetIndex].count += diff > 0 ? 1 : -1; diff = totalItems - allocations.reduce((sum, item) => sum + item.count, 0); } // 执行实际分配 allocations.forEach(alloc => { const assignedItems = remainingItems.splice(0, alloc.count); const targetObj = allocationObjects.find(obj => obj.id === alloc.id); if (targetObj) { targetObj.items.push(...assignedItems); } }); } // 测试示例:新增5个Items const newItems = ["item1", "item2", "item3", "item4", "item5"]; allocateItems(newItems); // 查看分配结果 console.log(allocationObjects); /* 输出结果: [ { id: 1, allocationPercentage: 40, items: [ 'item1', 'item2' ] }, { id: 2, allocationPercentage: 20, items: [ 'item3' ] }, { id: 3, allocationPercentage: 40, items: [ 'item4', 'item5' ] } ] */
关键细节说明
- 百分比校验:提前校验总和为100%,避免分配逻辑出现根本性错误。
- 数量调整机制:通过四舍五入得到基础分配数后,若总数与待分配Items数量有偏差,会按百分比高低调整,保证分配结果符合预期比例。
- 灵活适配:只需修改
allocationObjects中的allocationPercentage值,就能直接适配新的分配规则,无需改动核心逻辑。
内容的提问来源于stack exchange,提问作者MaximusAmarus
相关产品推荐
相关产品推荐

