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

JavaScript如何获取数组中最接近平均值的元素?

问题纠正与最优实现

你当前的实现逻辑存在本质偏差:排序后取中间位置拿到的是数组的中位数,不是最接近平均值的元素。你给出的示例里运行结果刚好是7,只是因为这个测试数组分布比较均匀,中位数恰好接近平均值,换个分布偏差大的数组结果就完全不对。
比如拿数组[1, 2, 3, 4, 100]测试:数组平均值是22,按你的逻辑取中间值得到3,但实际最接近22的元素是4,和正确结果差很远。

正确实现思路

不需要做排序操作,两次线性遍历就能搞定,时间复杂度O(n),比排序方案的O(nlogn)性能更高,结果完全准确:

  • 第一次遍历求数组所有元素的总和,除以数组长度得到真实平均值
  • 第二次遍历逐个计算每个元素和平均值的绝对差值,记录差值最小的元素即可
  • 如果遇到多个元素和平均值差值完全相等,默认保留第一个遍历到的元素就行,有特殊取数规则可以在这一步调整

参考代码

const getClosestToAverage = (arr) => {
  if (!arr.length) throw new Error('传入数组不能为空');
  // 计算平均值
  const average = arr.reduce((sum, num) => sum + num, 0) / arr.length;
  let closest = arr[0];
  let minDiff = Math.abs(arr[0] - average);

  for (let i = 1; i < arr.length; i++) {
    const currentDiff = Math.abs(arr[i] - average);
    if (currentDiff < minDiff) {
      minDiff = currentDiff;
      closest = arr[i];
    }
  }
  return closest;
}

// 测试你的示例数组
const arr = [1, 6, 10, 3, 15, 9, 4, 7];
console.log(getClosestToAverage(arr)); // 输出7,和你之前的结果一致属于巧合
// 测试偏态分布数组
const skewArr = [1, 2, 3, 4, 100];
console.log(getClosestToAverage(skewArr)); // 输出4,结果符合预期

注意事项

如果业务场景涉及浮点数计算,可以在比较差值的时候按需保留固定小数位,避免JS浮点数精度问题导致的判断错误。

内容的提问来源于stack exchange,提问作者TAHER El Mehdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.05 16:18:28