Javascript - 从对象数组中减去总数的最佳 logic/performance-wise

Javascript - best logic/performance-wise for subtract total from Array of Objects

我正在为这个逻辑想一个更好的方法。基本上,我有 3 层。每层都有数量限制。例如:

对于第 1 层,限制为 5 对于第 2 层,限制为 8 对于第 3 层,限制为 15。

[
            { title: 'Tier I', amount: 5, fullfiled: x, price: 10 },
            { title: 'Tier II', amount: 8, fullfiled: y, price: 20 },
            { title: 'Tier III', amount: 15, fullfiled: z, price: 30 },
]

来自我的后端的只是 Total。所以让我们假设它 returns 10。我需要得到差异来确定用户在哪一层。在这种情况下,第 2 层,因为对于第 1 层,将满足 5 的限制。对于第 2 层,只有 5 / 8 会被满足,因此 Y 将是 3,如下所示:

我需要得到这些限制之间的差异,以便我可以用数字替换 X、Y 和 Z。我想要一个解决这个问题的优雅方法的建议。我试图有一个带有限制的数组并减去以获得差异。 例如:

let totalCompleted = 10;
const limitTier = [5, 8, 15] 

limitTier.map(value => {
   // logic ? totalCompleted - value;
})

尝试使用 reducer 而不是 map。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

与此类似的内容:

const { tiers } = [
  { title: 'Tier I', amount: 5, price: 10 },
  { title: 'Tier II', amount: 8,  price: 20 },
  { title: 'Tier III', amount: 15,  price: 30 },
].reduce(({ rest, tiers } , tier) => ({
  rest: Math.max(rest - tier.amount, 0),
  tiers: [
    ...tiers,
    {
      ...tier,
      fullfiled: Math.min(tier.amount, rest),
    }
  ]
}), { rest: 10, tiers: [] })

试试这个解决方案。

const tiers = [
  { title: 'Tier I', amount: 5, fullfiled: 'x', price: 10 },
  { title: 'Tier II', amount: 8, fullfiled: 'y', price: 20 },
  { title: 'Tier III', amount: 15, fullfiled: 'z', price: 30 },
];

let totalCompleted = 10;

for (let item of tiers) {
  totalCompleted -= item.amount;
  if (totalCompleted < 0) {
    item.fullfiled = totalCompleted * -1;
    break;
  }
}
console.log('tier', tiers);