如何获得最接近数字数组平均值的数字? 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)
正如我在对另一个答案的评论中指出的那样,这就是其中一种情况,当您确实需要比“平均”更精确时。 median
和 mean
是最常见的平均值,根据您的需要,您可能会得到不同的答案。例如,在 [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]))
...而且我们还偶然发现了一些有用的函数,可以在这个程序或其他程序的其他地方使用。
如果我有一个数字数组并且我想得到最接近平均值的数字,我怎样才能得到那个数字?
我尝试按升序对数组进行排序,然后检索中间元素,即平均值。
注意:如果数组的长度是奇数而不是偶数,我使用了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)
正如我在对另一个答案的评论中指出的那样,这就是其中一种情况,当您确实需要比“平均”更精确时。 median
和 mean
是最常见的平均值,根据您的需要,您可能会得到不同的答案。例如,在 [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]))
...而且我们还偶然发现了一些有用的函数,可以在这个程序或其他程序的其他地方使用。