当前位置: 首页 > 科技观察

如何使用ArrayReducers在JavaScript中实现SQL聚合函数

时间:2023-03-16 17:20:45 科技观察

SQL查询中的聚合函数对一个或多个值执行计算并返回单个值。Count计算行数。Sum将给定列中的所有值相加。Min和Max返回指定列的最低值和最高值。AVG计算给定列中所有值的平均值。在所有示例中,我们将使用下表。文章标题|Views3调用方法的方式|1233Iterables转换成数组|88如何查找数组中的元素|402如何定位一个div|103下面是对应的Article对象数组。constarticles=[{title:'3种调用方法的方法',views:123},{title:'3IterablesConvertedIntoArrays',views:88},{title:'HowtoFindElementsinLargeArrays',views:402},{title:'HowtoPositionaDivElement',views:103}]RELAD方法使用恢复函数将数组中的所有值聚合为单个值,该函数对每个元素执行给定的恢复的数组函数。我们可以编写不同的缩减函数并计算与SQL查询中的聚合函数相同的聚合。计数下一个SQL查询计算文章表中的行数。SELECTCOUNT(*)FROMArticles要获取数组中对象的数量,我们可以简单地访问length属性。articles.length尽管如此,我们可以编写一个不计算数组中未定义值的reducer。如果当前元素不是无效的,计算值将在每一步递增。functioncount(total,article){return(article!=null&&article!==undefined)?total+1:total;}total聚合值初始化为0。注意第二个参数传递给Reduce方法。constnoOfArticles=articles.reduce(count,0);Sum下一个SQL查询从表中的所有文章中检索视图总计。SELECTSUM(Views)FROMArticles我们可以使用以下缩减函数来计算一系列对象的总浏览量。它采用到目前为止计算的总浏览量和当前文章,从文章中提取浏览量,并将其作为总数发布。functionsum(total,article){const{views}=article;returntotal+views;}进行此计算时,我们从0开始作为总观看次数。consttotal=articles.reduce(sum,0);以前的解决方案很好,它进行了所需的计算,但是它太具体了。让我们尝试编写一个更通用的函数,使用属性名称来计算总和。functionsum(propName){}事实上,Reduce方法使用两个参数调用reduce函数。第一个是到目前为止计算的聚合值,第二个参数是当前元素。Reduce方法不发送我们想要接受的属性名称。解决方案是让Sum函数获取所需的属性名称,然后返回Reduce方法所需的缩减函数。这是一个例子。functionsum(propName){returnfunction(total,obj){const{[propName]:value}=obj;返回总计+价值;}}请注意我们如何使用解构赋值语法从名为Anewvariablewithvalue的对象中动态提取对象。const{[propName]:value}=obj;在下面的sum函数下面创建Reduce方法使用的缩减函数。consttotal=articles.reduce(sum('views'),0);将另一个函数作为输入或返回函数的函数是高阶函数,而Sum是高阶函数。Min下一个SQL查询使用Min聚合函数来显示文章中的最小视图数。SELECTMIN(Views)FROMArticles//88使用计算到目前为止的最小视图数和当前文章对象的缩减器可以获得相同的结果。当当前文章的浏览量少于目前计算出的当前最小浏览量时,当前浏览量成为新的最小浏览量。functionmin(propName){returnfunction(minimum,obj){const{[propName]:value}=obj;返回值<最小值?值:最小值;}}我们需要回答另外一个问题,计算和0是初值。计算最小值时的初始值是多少?一个不错的选择是使用第一个帖子的浏览量作为初始最小值。constminum=articles.reduce(min('views'),articles[0].views);Max下面的SQL查询应用max聚合函数来查找最大视图数。SELECTMAX(Views)FROMArticlesmax函数检查属性名称并返回reducer函数,reducer获取计算出的最大值和当前对象。当对象的当前视图大于到目前为止计算的值时,当前视图计数成为新的最大值。否则,返回已经计算出的最大值。functionmax(propName){returnfunction(maximum,obj){const{[propName]:value}=obj;返回值>最大值?值:最大值;}}在调用reduce方法时,我们可以从0开始,作为初始的浏览数。consttotal=articles.reduce(max('views'),0);控制台日志(总计);Avg以下查询使用AVG函数计算所有文章的平均浏览次数。SELECTAVG(Views)FROMArticles平均值基本上是将所有视图的总和按数字或文章潜水的结果,我们可以使用前面的Sumreducer计算总视图数,然后按数组中的元素数潜水.consttotal=articles.reduce(sum('views'),0);constaverageViews=total/articles.length;在最终的SQL查询中编写的聚合函数允许将几行的值聚合成一个计算值。Reducearray方法允许将数组中的所有元素汇总为一个值。我们可以实现reducer函数并计算与SQL查询中的聚合函数相同的聚合。