You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的取值

方案优势

  1. 无需额外判断边界场景:总完成数为0、总完成数超过所有层级上限总和的情况都可以自动适配,比如总完成数为30时输出为[5,8,15],总完成数为2时输出为[2,0,0]
  2. 扩展性强:后续新增Tier等级只需要修改配置数组,不需要调整计算逻辑
  3. 无额外性能开销:仅单次遍历,无多余计算

内容的提问来源于stack exchange,提问作者anon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:45:01