如何在 JavaScript 中使用数组归约器实现 SQL 聚合函数

开发 前端
SQL查询中的聚合函数对一个或多个值执行计算,并返回单个值。

SQL查询中的聚合函数对一个或多个值执行计算,并返回单个值。

  • Count计算行数。
  • Sum从给定的列中添加所有值。
  • Min和Max返回指定列的最低和最高值。
  • AVG计算给定列中所有值的平均值。

在所有示例中,我们将使用下表。

Articles
Title | Views
3 Ways of Invoking a Method | 123
3 Iterables Converted Into Arrays | 88
How to Find Elements in Array | 402
How to Position a Div | 103

以下是文章对象的相应数组。

const articles = [
{title: '3 Ways of Invoking a Method', views: 123},
{title: '3 Iterables Converted Into Arrays', views: 88},
{title: 'How to Find Elements in Large Arrays', views: 402},
{title: 'How to Position a Div Element', views: 103}
]

RELAD方法使用还原函数将所有值从数组汇总为单个值,它在数组的每个元素上执行给定的还原函数。

我们可以编写不同的还原函数,并计算与SQL查询中的聚合函数相同的聚合物。

Count

下一个SQL查询计算文章表中的行数。

SELECT COUNT(*)
FROM Articles

为了在数组中获取对象的数量,我们可以简单地访问长度属性。

articles.length

尽管如此,我们可以编写一个不计算数组中未定义值的还原器。如果当前元素不是无效的,则计算值在每个步骤中会增加。

function count(total, article){
return (article != null && article !== undefined) ? total + 1 : total;
}

总聚合值用0初始化。请注意,第二个参数传递给了Reduce方法。

const noOfArticles= articles.reduce(count, 0);

Sum

下一个SQL查询从表中的所有文章中检索了视图总数。

SELECT SUM(Views)
FROM Articles

我们可以使用以下还原函数从一系列对象计算总视图。它采用到目前为止计算的观点总数和当前文章,它从文章中提取视图数量,并将其广告为总数。

function sum(total, article){
const {views} = article;
return total + views;
}

进行此计算时,我们从0开始作为视图总数。

const total = articles.reduce(sum, 0);

先前的解决方案很好,它可以执行所需的计算,但太具体了。让我们尝试编写一个更通用的功能,该功能以用于计算总和的属性名称。

function sum(propName){}

事实是,Reduce方法使用两个参数调用还原函数。第一个是到目前为止计算的汇总值,第二个参数是当前元素。Reduce方法不会发送我们要接受的属性名称。

解决方案是使Sum函数获取所需的属性名称,然后,返回Reduce方法所需的还原功能。

这是一个例子。

function sum(propName){
return function(total, obj){
const {[propName]: value} = obj;
return total + value;
}
}

请注意,我们如何使用破坏分配语法将对象从对象中动态提取为称为值的新变量。

const {[propName]: value} = obj;

在下面的总和函数下方创建了Reduce方法使用的还原函数。

const total = articles.reduce(sum('views'), 0);

将另一个函数作为输入或返回函数的功能是高阶函数,Sum是一个高阶函数。

Min

下一个SQL查询使用最小聚合函数来显示文章中的最小视图数量。

SELECT MIN(Views)
FROM Articles
//88

使用还原器可以实现相同的结果,该还原器迄今为止计算出的最小视图数量和当前文章对象。当当前文章的视图少于到目前为止计算的当前最小值时,当前的视图数将成为新的最小值。

function min(propName){
return function(minimum, obj){
const {[propName]: value} = obj;
return value < minimum ? value : minimum;
}
}

我们需要回答另一个问题,计算总和0是初始值。计算最小值时的初始值是多少?

一个不错的选择是将第一篇文章中的视图数量用作最初的最小值。

const minum = articles.reduce(min('views'), articles[0].views);

Max

下面的SQL查询应用最大聚合函数以找到最大视图数。

SELECT MAX(Views)
FROM Articles

最大函数以属性名称检查并返回还原功能,还原器到目前为止获得了计算的最大值和当前对象。当当前对象的视图大于迄今为止计算的值大的视图时,当前视图数量变为新的最大值。否则,返回已经计算的最大值。

function max(propName){
return function(maximum, obj){
const {[propName]: value} = obj;
return value > maximum ? value : maximum;
}
}

调用减少方法时,我们可以从0开始作为初始视图数量。

const total = articles.reduce(max('views'), 0);
console.log(total);

Avg

下面的查询使用AVG函数计算所有文章的平均视图数量。

SELECT AVG(Views)
FROM Articles

平均值基本上是通过数字或文章潜入所有视图总和的结果,我们可以使用先前的Sum 还原器来计算视图总数,然后通过数组中的元素数进行潜水。

const total= articles.reduce(sum('views'), 0);
const averageViews = total / articles.length;

写在最后

SQL查询中的聚合函数允许将几行的值汇总到计算值中。

Reduce数组方法允许将数组中的所有元素汇总到单个值中。

我们可以实现 reducer 函数,并计算与SQL查询中的汇总函数相同的聚合物。

责任编辑:华轩 来源: web前端开发
相关推荐

2023-03-05 19:28:11

JavaScripCSS

2019-04-23 15:20:26

JavaScript对象前端

2022-05-10 09:12:16

TypeScript装饰器

2020-09-09 07:00:00

TensorFlow神经网络人工智能

2018-10-11 09:40:53

前端JavaScript编程语言

2023-08-24 10:24:54

GitLabPodman

2021-03-18 10:45:02

JavaScript数组运算符

2021-03-11 23:43:20

JavaScript数组开发

2021-03-09 07:27:40

Kafka开源分布式

2015-08-27 09:46:09

swiftAFNetworkin

2022-05-17 08:25:10

TypeScript接口前端

2024-01-18 08:37:33

socketasyncio线程

2021-06-09 09:36:18

DjangoElasticSearLinux

2022-06-23 08:00:53

PythonDateTime模块

2011-08-10 09:31:41

Hibernateunion

2019-09-16 19:00:48

Linux变量

2020-11-30 11:55:07

Docker命令Linux

2020-04-09 10:18:51

Bash循环Linux

2014-07-02 09:47:06

SwiftCocoaPods

2020-08-02 23:56:34

JavaScript函数代码
点赞
收藏

51CTO技术栈公众号