如何在JavaScript数组中获取最接近目标值的较小数值?
解决数组中获取最接近目标值的较小数值问题
你的现有代码仅通过绝对值差判断最接近的数值,因此会选中15(与目标13的绝对值差为2),但需求是要获取不大于目标值且最接近目标的数值(或当所有数都大于目标时,选最小的那个数),所以需要调整判断逻辑。
修改后的代码
var counts = [4, 9, 15, 6, 2], goal = 13; var closest = counts.reduce(function(prev, curr) { const prevIsValid = prev <= goal; const currIsValid = curr <= goal; // 当前值符合<=goal,prev不符合,选当前值 if (currIsValid && !prevIsValid) { return curr; } // 当前值不符合,prev符合,保留prev else if (!currIsValid && prevIsValid) { return prev; } // 两者都符合,选与goal差更小的(更接近目标) else if (currIsValid && prevIsValid) { return (goal - curr) < (goal - prev) ? curr : prev; } // 两者都不符合,选更小的那个(最接近目标的较小数值) else { return curr < prev ? curr : prev; } }); console.log(closest); // 输出9
逻辑说明
- 优先保留小于等于目标值的数值,这是需求的核心要求;
- 当两个数值都符合
<=goal时,选择与目标值差值最小的(即最接近的); - 如果所有数值都大于目标值,则选择其中最小的那个(它是最接近目标的“较小数值”)。
简化版写法
如果想要更简洁的代码,可以通过计算“优先级得分”来判断:
var counts = [4, 9, 15, 6, 2], goal = 13; var closest = counts.reduce((prev, curr) => { // 符合<=goal的数值,得分是与goal的差值(越小越优先) // 不符合的数值,得分设为goal+curr(确保优先级低于所有符合条件的,且数值越小得分越低) const prevScore = prev <= goal ? goal - prev : goal + prev; const currScore = curr <= goal ? goal - curr : goal + curr; return prevScore < currScore ? prev : curr; }); console.log(closest); // 输出9
内容的提问来源于stack exchange,提问作者SavceBoyz
相关产品推荐
相关产品推荐

