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

如何在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

逻辑说明

  1. 优先保留小于等于目标值的数值,这是需求的核心要求;
  2. 当两个数值都符合<=goal时,选择与目标值差值最小的(即最接近的);
  3. 如果所有数值都大于目标值,则选择其中最小的那个(它是最接近目标的“较小数值”)。

简化版写法

如果想要更简洁的代码,可以通过计算“优先级得分”来判断:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 00:55:54