You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在网页中使用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);

表达式逻辑解释

  1. 分组核心:$item.OWNED & "|" & $item.DOSSIER 把两个分组字段拼接成唯一的键(比如A|Private),确保每个组合的分组唯一;
  2. 统计转换:
    • 写法一中的$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:24:34