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)。通过这个问题,我们将了解如何切片和计算数组中分组元素的平均值。这就是我们如何解决给定问题的方法。它将以较低的时间复杂度和空间复杂度来提高逻辑思维和编码能力。