JavaScript数组中每n个元素一组求平均值


给定问题要求找出数组中每n个元素一组的平均值。如果数组中有m个元素,则计算每组的平均值,并以数组形式显示结果。

理解问题

假设数组中有6个元素,每组2个元素。现在分别计算每组的平均值。现在我们有了它们的平均值,可以将它们组合成一个数组。

为了实现这个问题,我们使用了reduce()、push()和slice()。这些是javascript中的预定义方法。

reduce()函数将对数组的每个元素运行一个reducer函数,并给出一个单一的输出值。reduce()函数的语法如下:

 array.reduce(callbackFunction(currentValue, currentIndex), initialValue)

push()函数用于将所有元素推入数组。它在最后一个索引处向数组添加一个新项。它还会更改数组的大小。“push()”的语法如下:

输入

colors = ["Red", "Blue", "Black"];
colors.push("Pink","Grey");

输出

[ 'Red', 'Blue', 'Black', 'Pink', 'Grey' ]

slice()函数通过切片从数组中返回选定的项作为新数组。此函数的机制是从指定的起点到终点选择元素。此函数的特性是它不会更改实际数组。语法如下:

输入

colors = ["Red", "Blue", "Black", "Pink", "Grey"];
color = colors.slice(1,3);

输出

[ 'Blue', 'Black' ]

算法 - 使用slice、reduce和push函数

步骤1:为了解决这个问题,声明一个名为groupAverage的函数,该函数接收一个整数数组作为输入。

步骤2:声明函数后,我们需要声明一个数组来存储元素,并将其命名为result,值为0(初始化为空)。

步骤3:使用for循环遍历每个整数元素,直到array.length。

步骤4:这是我们将创建元素组并将它们分配给batch变量的主要步骤。

步骤5:此步骤将确定我们创建的每组的平均值。为此,我们将添加每组的组成部分,计算它们的平均值,并将avg变量赋值。

步骤6:现在,在这个步骤中,计算出的平均值将被添加到或推入result数组中。

步骤7:给出计算每组平均值后的结果。获得平均值后,我们需要将它们推入一个新数组。因此,结果将是数组的数组。

示例

//Define a function to calculate average
function groupAverage (a, n) {
  var result = [];

  for (let i = 0; i < a.length; i =i+n) {
   var batch = a.slice(i, i + n);
   var avg = batch.reduce((sum, b) => sum + b, 0) / batch.length;
   result.push(avg);
  }

  return result;
}
//Define array and number to calculate average of groups
var arr = [11, 21, 31, 41, 51, 61, 71, 81, 91];
var num = 3;

// Calling the function and store it in result
var output = groupAverage(arr, num);
console.log("Average of every group of n elements in an array")
console.log(output); 

输出

Average of every group of n elements in an array
[ 21, 51, 81 ]

在上面的代码中,我们定义了一个名为groupAverage()的函数,它接受两个参数:一个数组'a'和一个数字'n'。使用for循环迭代数组的元素,每步增加n。

在循环内,将数组从当前索引切片到前面n个元素,并将结果添加到名为group的变量中。通过对group调用javascript函数reduce()并除以其长度来计算group的平均值,并将结果赋值给名为avg的变量。现在将avg值推入result数组。然后返回并显示函数的结果。

算法 - 使用两个for循环

步骤1:第一步,定义包含一些值的数组。

步骤2:创建一个函数并命名为groupAvg()。该函数接受两个参数数组和num。其中num是单个组中元素的数量,数组是我们第一步中定义的变量。

步骤3:第二步之后,定义一个数组来存储结果。

步骤4:定义一个for循环,直到数组的长度。还初始化一个sum变量,初始值为0。

步骤5:在此步骤中,声明另一个for循环,它将迭代组元素。

步骤6:在此阶段确定该值是否为数字。如果没有数值,则将默认值设置为0。

步骤7:在result数组中,添加各个组的平均值。

步骤8:最后一步,打印输出并返回result的值。

示例

//Declare an array with name array
const array = [2, 1, 5, 4, 1, 3, 6, 7, 9];

//Function to calculate Average of groups 
function groupAvg(array, num) {
  var result = [];
  for (let i = 0; i < array.length;) {
   var sum = 0;
   for(let j = 0; j< num; j++){
     sum += +array[i++] || 0
   }
   result.push(sum/num);
  }
  return result
}

console.log("Group average for 3 and 2 items respectively: ")
console.log(groupAvg(array, 3)) 
console.log(groupAvg(array, 2)) 

输出

Group average for 3 and 2 items respectively: 
[ 2.666666666665, 2.666666666666665, 7.33333333333333 ]
[ 1.5, 4.5, 2, 6.5, 4.5 ]

复杂度

从上面的实现中可以看出,我们使用了for循环来实现预期的结果。现在我们发现groupCount()只适用于对象中存在的项目数量。那么时间复杂度为O(n)。其中n代表输入数据的大小。此外,由于总函数在group对象中为每个堆栈保留一个计数值,因此程序需要相同数量的内存,O(n)。

结论

此算法提供了关于slice()、reduce()和push()函数用法的基本思路。此算法的时间复杂度为O(N)。通过这个问题,我们将了解如何切片和计算数组中分组元素的平均值。这就是我们如何解决给定问题的方法。它将以较低的时间复杂度和空间复杂度来提高逻辑思维和编码能力。

更新于:2023年8月18日

862 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告