cheapestAvailableProduct

cheapestAvailableProduct

我有两个对象的以下数组:

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便宜),但是这可能是您进行调整的一个好开始。

09-10 18:23