修复JavaScript函数:筛选数组中不超过指定总价的最接近项
问题:找出所有orderTotal最接近且不超过指定总价的项
我有一个已排序的数组:
array = [ { id: 1, orderTotal: 50000 }, { id: 3, orderTotal: 50000 }, { id: 2, orderTotal: 100000 }, { id: 4, orderTotal: 200000 }, ]
需求是找出所有**orderTotal最接近指定总价(且不超过该总价)**的项。
我写了以下代码:
const getNearestOrderValue = (arr, totalPrice) => { let nearestItem = []; let maxSmaller = 0; for (const item of arr) { if (item?.orderTotal <= totalPrice && item?.orderTotal >= maxSmaller) { maxSmaller = item?.orderTotal; nearestItem.push(item); } } return nearestItem; }
当总价为80000时,代码返回正确结果:
[ { id: 1, orderTotal: 50000 }, { id: 3, orderTotal: 50000 }, ]
但当总价为120000时,代码返回:
[ { id: 1, orderTotal: 50000 }, { id: 3, orderTotal: 50000 }, { id: 2, orderTotal: 100000 } ]
而我期望的结果是:
[ { id: 2, orderTotal: 100000 } ]
请问如何修改getNearestOrderValue函数以得到正确结果?
解决方案
原代码的问题在于,只要当前项的orderTotal大于等于之前的maxSmaller且不超过总价,就会被加入数组,导致所有符合<=总价的递增项都被保留,而非仅保留最大的那一批。
利用数组已排序的特性,可以优化遍历逻辑,一次遍历完成目标:
const getNearestOrderValue = (arr, totalPrice) => { let nearestItem = []; let maxSmaller = -Infinity; // 初始化为负无穷,兼容orderTotal为0的场景 for (const item of arr) { const currentTotal = item?.orderTotal; if (currentTotal > totalPrice) { // 数组已排序,后续项只会更大,直接终止循环 break; } if (currentTotal > maxSmaller) { // 找到更大的符合条件值,重置结果数组和最大值 maxSmaller = currentTotal; nearestItem = [item]; } else if (currentTotal === maxSmaller) { // 与当前最大值相等,直接追加到结果数组 nearestItem.push(item); } } return nearestItem; }
逻辑说明
- 借助数组的有序性,遇到超过总价的项直接跳出循环,提升遍历效率
- 初始
maxSmaller设为负无穷,避免遗漏orderTotal为0的有效项 - 每次找到更大的符合条件值时,清空现有结果数组并重新添加当前项,确保只保留最大批次的项
- 遇到与当前最大值相等的项时,直接追加到结果数组,保证同值项全部被收集
验证结果
- 总价为80000时,返回
[{ id: 1, orderTotal: 50000 }, { id: 3, orderTotal: 50000 }],符合预期 - 总价为120000时,返回
[{ id: 2, orderTotal: 100000 }],符合预期
内容的提问来源于stack exchange,提问作者huong1412
相关产品推荐
相关产品推荐

