JavaScript数组查找拟合范围

JavaScript数组查找拟合范围,javascript,Javascript,我有以下带有两个对象的数组: 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(

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

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();
}

这不适用于过度购买是最便宜的选择的情况(例如:在
4x40
购买160件,而不是在
3x40+1x25+1x5
购买150件更便宜),但这可能是调整的一个好开始。

按每个许可证的价格订购您的计划:

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();
}

这不适用于过度购买是最便宜的选择的情况(例如:在
4x40
购买160件,而不是在
3x40+1x25+1x5
购买150件更便宜),但这可能是一个很好的开始。

首先根据许可证数量对数组进行排序,然后获取许可证数量小于要购买的许可证数量的对象(刚好小于数组中下一个大于要购买的许可证数量的项)


首先根据许可证数量对阵列进行排序,然后获取许可证数量小于要购买许可证数量的对象(刚好小于阵列中大于要购买许可证数量的下一项)


这里只是一个简单的
forEach
。获取请求的数字,开始根据选项限制计算/修改总数,一旦请求的数字小于选项限制,您就有了最终总数,该总数将不再修改并从函数返回

function calculateDiscountedTotal(numberRequested, myArr){
    var total;
    // loop, compare, calculate
    myArr.forEach(function(option) {
         if(numberRequested >= option.licenses){
            total = numberRequested * option.new_value_pr_licence
         }
    }
    if(total != undefined){
         return total;
    } else {
         // user never had enough for initial discount
         return "no discount price";
    }
}

这里只是一个简单的
forEach
。获取请求的数字,开始根据选项限制计算/修改总数,一旦请求的数字小于选项限制,您就有了最终总数,该总数将不再修改并从函数返回

function calculateDiscountedTotal(numberRequested, myArr){
    var total;
    // loop, compare, calculate
    myArr.forEach(function(option) {
         if(numberRequested >= option.licenses){
            total = numberRequested * option.new_value_pr_licence
         }
    }
    if(total != undefined){
         return total;
    } else {
         // user never had enough for initial discount
         return "no discount price";
    }
}


这意味着他属于100类,因为他拥有100张以上的驾照,但低于200张,这意味着他支付40美元的公共关系许可证
没有获得这部分。想要购买150个许可证的人怎么会被归为100类?算法只是获取想要的许可证,并计算总成本?抱歉,分类是一个错误的词。他在该价格范围内,这意味着他有资格享受100+@gurvinder372的折扣,因为这不足以获得下一个,更好的折扣/价格无关的旁注:如果能以200*$25=$5000购买200个许可证,没有人会以150*$40=$6000购买150个许可证。
这意味着他属于100类,因为他高于100个许可证,但低于200,这意味着他支付40$pr许可证。
没有获得这部分。想要购买150个许可证的人怎么会被归为100类?算法只是获取想要的许可证,并计算总成本?抱歉,分类是一个错误的词。他在这个价格范围内,这意味着他有资格享受100+@gurvinder372的折扣,因为这还不足以获得下一个更好的折扣/价格无关的旁注:没有人会以150*的价格购买150个许可证$40=$6000,如果他们能以200*的价格购买200个许可证$25=$5000。如果计划是以5美元购买1个,或者以100美元购买100个,而我想要101个许可证,该算法建议以200美元购买200个,而不是以105美元购买101个。@nickf是的,但OP从未提到可以购买许可证组合以获得最低成本价值。但是如果你已经做到了,那么酷:)如果计划是5美元买1个,或者100美元买100个,我想要101个许可证,这个算法会建议用200美元买200个,而不是用105美元买101个。@nickf是的,但OP从来没有提到可以购买许可证组合以获得最低成本价值。但是如果你已经做到了,那么酷:)这比一个简单的forEach循环好吗?也许我遗漏了什么?我肯定提问者可能更感兴趣的是寻找答案的策略,而不是使用for循环和while循环的优点。这比简单的forEach循环好吗?也许我遗漏了什么?我肯定提问者可能更感兴趣的是寻找答案的策略,而不是使用for循环和while循环的优点。