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);
我正在为这个逻辑想一个更好的方法。基本上,我有 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);