多列数组中寻找最接近目标值的size上限值问题求助
解决数组中寻找目标值最接近上限size的问题
嘿,我完全懂你遇到的困扰——你要找的不是单纯“最接近”目标值的size,而是大于等于目标值的最小上限值对吧?之前的逻辑可能只是在找数值差最小的项,所以当目标值75和50、100的差值都是25时,就误选了先遇到的50。咱们来一步步修复这个问题:
核心思路
先把数组里的size字符串转成数值(避免字符串比较的坑),然后按数值从小到大排序,最后找到第一个大于等于目标值的项;如果所有size都小于目标值,就返回最大的那个作为兜底。
具体实现代码
假设你的数组结构是类似这样的:
const sizeOptions = [ { size: "50" }, { size: "100" }, { size: "200" }, { size: "500" } ];
可以写一个专门的函数来处理:
function getUpperBoundSize(goal, sizeArray) { // 第一步:把每个size转成数值,同时保留原对象信息,过滤无效项 const numericSizeList = sizeArray.map(item => ({ ...item, numSize: parseInt(item.size, 10) })).filter(item => !isNaN(item.numSize)); // 第二步:按数值从小到大排序 numericSizeList.sort((a, b) => a.numSize - b.numSize); // 第三步:找到第一个大于等于目标值的项 const matchedItem = numericSizeList.find(item => item.numSize >= goal); // 兜底:如果所有size都小于目标,返回最大的那个 return matchedItem ? matchedItem : numericSizeList[numericSizeList.length - 1]; }
测试验证
- 当
goal = 75时,函数会返回{ size: "100", numSize: 100 },完美符合你“≥51就选100”的要求; - 当
goal = 95时,同样返回100的项; - 当
goal = 50时,返回50的项; - 当
goal = 600时,返回最大的500项(如果不需要兜底可以改成返回null,按需调整)。
为什么之前的逻辑出错?
大概率是这两个原因:
- 字符串比较问题:如果直接用字符串"75"和"50"、"100"比较,JavaScript会按字符编码排序,"100"的第一个字符是"1",比"7"小,所以会排在"75"前面,导致误判;
- 逻辑方向错误:之前的逻辑可能是计算每个size和目标值的差值,取差值最小的,但当差值相同时(比如75和50、100的差都是25),就会选中数组中先出现的那个项。
内容的提问来源于stack exchange,提问作者Meules
相关产品推荐
相关产品推荐

