如何在网页中使用JSONATA对JSON数据按多字段分组并统计数量
如何在网页中使用JSONATA对JSON数据按多字段分组并统计数量
嘿,我来帮你搞定这个JSONATA分组统计的问题!从你的描述来看,你需要同时按OWNED和DOSSIER两个字段对数据分组,然后统计每组的DIP_ID数量对吧?咱们一步步来理清楚。
首先明确你的原始数据:
var mydata = [ { "OWNED": "A", "DOSSIER": "Private", "DIP_ID": 8619 }, { "OWNED": "B", "DOSSIER": "Public", "DIP_ID": 17 }, { "OWNED": "C", "DOSSIER": "Private", "DIP_ID": 27635 }, { "OWNED": "A", "DOSSIER": "Public", "DIP_ID": 111 }, { "OWNED": "B", "DOSSIER": "Public", "DIP_ID": 110 } ];
你的目标是得到结构类似这样的结果:
[ { "OWNED": "A", "DOSSIER": "Private", "COUNT": 1 }, { "OWNED": "B", "DOSSIER": "Public", "COUNT": 2 }, { "OWNED": "C", "DOSSIER": "Private", "COUNT": 1 }, { "OWNED": "A", "DOSSIER": "Public", "COUNT": 1 } ]
分析你之前的尝试问题
你之前写的表达式{'counter': $count(DIP_ID), 'sku':$distinct(OWNED)}缺少核心的分组逻辑:直接对整个数组使用$count(DIP_ID)只会统计所有DIP_ID的总数,无法按指定字段拆分分组;同时$distinct(OWNED)也只能拿到唯一的OWNED值,没法关联对应的DOSSIER和统计数。
正确的解决方案
我给你提供两种简洁且有效的JSONATA表达式写法,搭配完整的JavaScript代码示例:
写法一:使用$groupBy + $map(更直观易读)
var mydata = [ { "OWNED": "A", "DOSSIER": "Private", "DIP_ID": 8619 }, { "OWNED": "B", "DOSSIER": "Public", "DIP_ID": 17 }, { "OWNED": "C", "DOSSIER": "Private", "DIP_ID": 27635 }, { "OWNED": "A", "DOSSIER": "Public", "DIP_ID": 111 }, { "OWNED": "B", "DOSSIER": "Public", "DIP_ID": 110 } ]; // 用模板字符串避免转义双引号,表达式更清晰 var expr = ` $groupBy($, function($item) { $item.OWNED & "|" & $item.DOSSIER }) ~> $map(function($group) { { "OWNED": $group[0].OWNED, "DOSSIER": $group[0].DOSSIER, "COUNT": $count($group) } }) `; // 执行JSONATA计算 var result = await jsonata(expr).evaluate(mydata); console.log(result);
写法二:使用JSONATA的对象分组语法(更简洁)
var mydata = [ { "OWNED": "A", "DOSSIER": "Private", "DIP_ID": 8619 }, { "OWNED": "B", "DOSSIER": "Public", "DIP_ID": 17 }, { "OWNED": "C", "DOSSIER": "Private", "DIP_ID": 27635 }, { "OWNED": "A", "DOSSIER": "Public", "DIP_ID": 111 }, { "OWNED": "B", "DOSSIER": "Public", "DIP_ID": 110 } ]; var expr = ` $${ OWNED & "|" & DOSSIER: { "OWNED": OWNED, "DOSSIER": DOSSIER, "COUNT": $count($) } } ~> $each(function($value) { $value }) `; var result = await jsonata(expr).evaluate(mydata); console.log(result);
表达式逻辑解释
- 分组核心:
$item.OWNED & "|" & $item.DOSSIER把两个分组字段拼接成唯一的键(比如A|Private),确保每个组合的分组唯一; - 统计转换:
- 写法一中的
$map会遍历分组后的对象,把每个分组数组转换成你需要的结构:取分组第一个元素的OWNED和DOSSIER(同一组的这两个值完全一致),用$count($group)统计组内元素数量; - 写法二中的
$${ ... }是JSONATA的分组对象语法,自动按指定键分组,再用$each把对象值提取成数组。
- 写法一中的
最终结果
执行代码后,你会得到完全符合需求的结果:
[ { "OWNED": "A", "DOSSIER": "Private", "COUNT": 1 }, { "OWNED": "B", "DOSSIER": "Public", "COUNT": 2 }, { "OWNED": "C", "DOSSIER": "Private", "COUNT": 1 }, { "OWNED": "A", "DOSSIER": "Public", "COUNT": 1 } ]
备注:内容来源于stack exchange,提问作者Franco
相关产品推荐
相关产品推荐

