如何获得最接近数字数组平均值的数字? JavaScript

How to get the number nearest to the average of array of numbers? JavaScript

如果我有一个数字数组并且我想得到最接近平均值的数字,我怎样才能得到那个数字?

我尝试按升序对数组进行排序,然后检索中间元素,即平均值。

注意:如果数组的长度是奇数而不是偶数,我使用了Math.floor()

const arr = [1, 6, 10, 3, 15, 9, 4, 7];
const arrSorted = arr.sort((a,b)=>a-b);
const nearToAVG = arrSorted[Math.floor(arr.length/2)];
console.log(nearToAVG); // 7

是否有更好的方法使数组中的数字接近平均值?

您应该将所有数字相加并除以数组的长度。 除此之外,排序数组的中心数字不是数字的平均值,只是中位数。

let numArray=[12,32,134,23,54,345,32,1]; //all elements numbers
let num=0;
for(let number of numArray) {num+=number};
num/=numArray.length
console.log(num)

让我们来剖析一下这个问题。您想要具有最接近数组索引平均值的索引。为此,您可以先计算数组的总和。知道总和后,您可以对数组 arr 进行第二次扫描,以获取每个元素与平均值的差值并将其存储在变量中。最后,如果平均值和当前索引之间的差异比存储值更接近于零,您将更新该变量。在数组的末尾,您将找到您正在寻找的答案。

这是上面的一个简单例子:

const arr = [1, 6, 10, 3, 15, 9, 4, 7];

// get average
let sum = 0;
for(let i = 0; i < arr.length; sum += arr[i], i++);
let ave = sum / arr.length; // 6.875


function nearestIdxToAverage(array, average) {
    if(!array.length) return 0;

    // stores initial difference and gets replaced by index
    let nearest = Math.abs(array[0] - average);

    for(let i = 0; i < array.length; i++) {
        const diff = Math.abs(array[i] - average);
        // stores the offset of the diff closest to 0 (relative to the average)
        nearest = (diff < nearest)? i: nearest;
    }

    return nearest;
}

console.log(`average: ${ave}\nnearest idx: ${nearestIdxToAverage(arr, ave)}`);

// average: 6.875
// nearest idx: 7

实现该目标的另一种方法是使用:

  • reduce累加和除以长度得到平均值

  • map 迭代该数组并 return 每个数字及其 nearByAVG (该数字与平均值之间的距离)

  • sort 按 属性 顺序 ascending 得到第一个与平均值的最小距离。

const arr = [1, 6, 10, 3, 15, 9, 4, 7];
const sum = arr.reduce((acc, curr)=>acc+curr);
const avg = sum/arr.length;
const arrMaped = arr.map(num=>({num,nearByAVG: Math.abs(num-avg)}));
const arrSorted = arrMaped.sort((a,b)=>a.nearByAVG-b.nearByAVG);
console.log(arrSorted[0].num)

正如我在对另一个答案的评论中指出的那样,这就是其中一种情况,当您确实需要比“平均”更精确时。 medianmean 是最常见的平均值,根据您的需要,您可能会得到不同的答案。例如,在 [3, 20, 1, 4, 2] 中,中位数是 3,但是,由于平均值是 6,因此最接近平均值的原始值是 4.

此版本假定您要获取数组中最接近数字算术平均值的值:

const closestToMean = (ns, m = ns .reduce ((a, b) => a + b, 0) / ns .length) =>
  ns .reduce ((c, n) => Math .abs (n - m) < Math .abs (c - m) ? n : c, Infinity)

console .log (closestToMean ([3, 20, 1, 4, 2]))
console .log (closestToMean ([1, 6, 10, 3, 15, 9, 4, 7]))

我们将数字相加并除以它们的长度以求出均值,然后折叠数字列表,在每个阶段都保持更接近该均值的那个。

我实际上更愿意将其分解并提取常见的辅助函数 sum,它汇总了一个数字数组 mean,它使用 sum 来计算算术平均值, 和 minimumBy,它根据应用提供给每个元素的函数的结果找到数组的最小元素。我认为这个版本更具可读性:

const sum = (ns) =>
  ns .reduce ((a, b) => a + b, 0)

const mean = (ns) => 
  sum (ns) / ns .length

const minimumBy = (fn) => (ns) =>
  ns .reduce ((c, n) => fn (n) < fn (c) ? n : c, Infinity)

const closestToMean = (ns, m = mean (ns)) =>
  minimumBy (n => Math .abs (n - m)) (ns)

console .log (closestToMean ([3, 20, 1, 4, 2]))
console .log (closestToMean ([1, 6, 10, 3, 15, 9, 4, 7]))

...而且我们还偶然发现了一些有用的函数,可以在这个程序或其他程序的其他地方使用。