JavaScript中计算多级配额对象数组完成量的最优逻辑与性能方案
解决方案
直接单遍历依次扣减总量即可,时间复杂度为O(n)(n为Tier层级数量,当前场景下仅为3,性能已到最优),逻辑简洁无冗余:
直接处理原始Tier配置数组(推荐)
如果你需要直接得到更新后的完整Tier对象数组,可以用不可变更新的方式实现:
// 原始Tier配置 const tiers = [ { title: 'Tier I', amount: 5, fullfiled: 0, price: 10 }, { title: 'Tier II', amount: 8, fullfiled: 0, price: 20 }, { title: 'Tier III', amount: 15, fullfiled: 0, price: 30 }, ] let totalCompleted = 10 const calculatedTiers = tiers.map(tier => { // 当前层级最多能填充的数量:取层级上限和剩余完成数的较小值 const currentFill = Math.min(tier.amount, totalCompleted) // 扣减已填充的数量,剩余值留给下一层级 totalCompleted -= currentFill // 返回更新后的层级对象,不会修改原数组 return { ...tier, fullfiled: currentFill } })
执行后calculatedTiers中各层级的fullfiled值就是预期的5、5、0。
单独计算fullfiled值数组
如果你只需要按顺序得到各层级的fullfiled值,对应你之前提取上限数组的写法可以调整为:
let totalCompleted = 10 const limitTier = [5, 8, 15] const fullfiledValues = limitTier.map(limit => { const cur = Math.min(limit, totalCompleted) totalCompleted -= cur return cur }) // 输出 [5, 5, 0],对应x、y、z的取值
方案优势
- 无需额外判断边界场景:总完成数为0、总完成数超过所有层级上限总和的情况都可以自动适配,比如总完成数为30时输出为
[5,8,15],总完成数为2时输出为[2,0,0] - 扩展性强:后续新增Tier等级只需要修改配置数组,不需要调整计算逻辑
- 无额外性能开销:仅单次遍历,无多余计算
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

