我有两个对象的以下数组:
var myArr = [{
id: 3,
licences: 100
new_value_pr_licence: 40
}, {
id: 4,
licences: 200
new_value_pr_licence: 25
}]
用户希望购买150个许可证。这意味着它们属于类别100,因为它们的许可证数量超过100,但低于200,这意味着它们需要为每个许可证支付40美元。
请注意,数组对象的值会有所不同。
最佳答案
按许可价格订购您的计划:
myArr.sort(function (a, b) {
return a.new_value_pr_licence - b.new_value_pr_licence;
})
然后从阵列的开头开始,尽可能多地采用该计划,而不必考虑用户想要购买的数量:
var numUserWants = 150;
var purchases = {};
var cheapestAvailableProduct = myArr.shift();
while (numUserWants > 0 && cheapestAvailableProduct) {
if (numUserWants <= cheapestAvailableProduct.licences) {
purchases[cheapestAvailableProduct.id] = Math.floor(cheapestAvailableProduct.licences / numUserWants);
numUserWants = cheapestAvailableProduct.licences % numUserWants;
}
cheapestAvailableProduct = myArr.shift();
}
此时,
purchases
现在将是计划ID到数字的映射:purchases => {
3: 3
4: 1
}
这不能解决过度购买是最便宜的选择的情况(例如:在
4x40
处购买160而不是在3x40 + 1x25 + 1x5
处购买150便宜),但是这可能是您进行调整的一个好开始。