You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复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;
}

逻辑说明

  1. 借助数组的有序性,遇到超过总价的项直接跳出循环,提升遍历效率
  2. 初始maxSmaller设为负无穷,避免遗漏orderTotal为0的有效项
  3. 每次找到更大的符合条件值时,清空现有结果数组并重新添加当前项,确保只保留最大批次的项
  4. 遇到与当前最大值相等的项时,直接追加到结果数组,保证同值项全部被收集

验证结果

  • 总价为80000时,返回[{ id: 1, orderTotal: 50000 }, { id: 3, orderTotal: 50000 }],符合预期
  • 总价为120000时,返回[{ id: 2, orderTotal: 100000 }],符合预期

内容的提问来源于stack exchange,提问作者huong1412

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:23:11