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 方式的主要内容,如果未能解决你的问题,请参考以下文章
在没有 GIDSignInButton 的情况下但以编程方式启动 Google 登录