SQL 有,但以 Javascript 方式

Posted

技术标签:

【中文标题】SQL 有,但以 Javascript 方式【英文标题】:SQL Having, but in Javascript way 【发布时间】:2020-08-04 09:05:29 【问题描述】:

所以我在这里用 javascript 来转换 SQL 查询,但使用 Javascript。

以下 SQL 语句列出了每个国家/地区的客户数量。 仅包括客户超过 5 个的国家/地区

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;

请在下面查看我的数组的 JS 对象和他的预期输出。

//my array
[
  
    customerID: 1,
    CustomerName: "Alfreds Futterkiste",
    contactName: "Maria Anders",
    country: "Germany",
  ,
  
    customerID: 2,
    CustomerName: "Ana Trujillo Emparedados y helados",
    contactName: "Ana Trujillo",
    country: "Mexico",
  ,
  
    customerID: 3,
    CustomerName: " Antonio Moreno Taquería",
    contactName: "Antonio Mereno Jr.",
    country: "Mexico",
  ,
];

//expected output
[
  
    country: "Mexico",
    count: 2
  ,
  
    country: "Germany",
    count: 1
  ,
]

我们可以使用 lodash 或任何库来解决这个问题

【问题讨论】:

遍历你的数组进行计数然后过滤。 【参考方案1】:

我们可以使用Array.reduce 来获得所需的结果,这可以通过按国家/地区创建客户地图来计算每个客户。

一旦我们有了这个,我们就可以使用 Object.values 将我们的地图转回一个数组。

如果我们希望过滤计数属性,我们可以对结果数据执行Array.filter。

Lodash 有一个 groupBy 函数,它可以做同样的事情。

const data = [
    customerID: 1,
    CustomerName: "Alfreds Futterkiste",
    contactName: "Maria Anders",
    country: "Germany",
  ,
  
    customerID: 2,
    CustomerName: "Ana Trujillo Emparedados y helados",
    contactName: "Ana Trujillo",
    country: "Mexico",
  ,
  
    customerID: 3,
    CustomerName: " Antonio Moreno Taquería",
    contactName: "Antonio Mereno Jr.",
    country: "Mexico",
  ,
];

const result = Object.values(data.reduce((map, customer) => 
  if (!map[customer.country]) 
    map[customer.country] = 
      country: customer.country,
      count: 0
    
  
  map[customer.country].count++;
  return map;
, ));


console.log("All results: ", result);

const countThreshold = 2;

console.log("Filtered by count (" + countThreshold + "): ", result.filter(r => r.count >= countThreshold));

【讨论】:

【参考方案2】:

根据您的要求尝试这个简单的解决方案。

var arr = [
    customerID: 1,
    CustomerName: "Alfreds Futterkiste",
    contactName: "Maria Anders",
    country: "Germany",
  ,
  
    customerID: 2,
    CustomerName: "Ana Trujillo Emparedados y helados",
    contactName: "Ana Trujillo",
    country: "Mexico",
  ,
  
    customerID: 3,
    CustomerName: " Antonio Moreno Taquería",
    contactName: "Antonio Mereno Jr.",
    country: "Mexico",
  ,
];

var countryCount = ;
arr.forEach(element => 
  countryCount[element.country] = countryCount[element.country] ? ++countryCount[element.country] : 1;
);


var output = Object.keys(countryCount).map(key => (
  country: key,
  count: countryCount[key]
));

console.log(output);

【讨论】:

以上是关于SQL 有,但以 Javascript 方式的主要内容,如果未能解决你的问题,请参考以下文章

JSTL:迭代列表但以不同方式处理第一个元素

按同一列分组,但以两种不同的方式聚合

在没有 GIDSignInButton 的情况下但以编程方式启动 Google 登录

如何创建一个显示唯一值计数但以增量/顺序方式显示的df? [复制]

如何在骆驼中将文件拆分为行但以不同方式处理第一行

Matplotlib:在两点之间绘制一条线......但以一种不寻常的方式