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

使用JSONata按属性值分组重构JSON结构的技术咨询

使用JSONata按属性值分组重构JSON结构的技术咨询

嘿,我刚好之前折腾过类似的JSON结构转换需求,用JSONata来实现这个分组重构其实特别简洁,我来给你拆解一下具体怎么弄~

首先先明确你的需求:把一个包含多个对象的数组,按group字段的值进行外层分组,每个分组内部再把month作为键、value作为值,最终转成嵌套的对象结构对吧?

先把你的输入和目标输出用清晰的代码块展示出来(我把转义的双引号还原了,看起来更直观):

输入JSON

[
    {
        "group": "a",
        "month": "01",
        "value": "10"
    },
    {
        "group": "a",
        "month": "02",
        "value": "20"
    },
    {
        "group": "b",
        "month": "01",
        "value": "30"
    },
    {
        "group": "b",
        "month": "02",
        "value": "40"
    }
]

目标输出JSON

{
   "a": {
      "01": "10",
      "02": "20"
   },
   "b": {
      "01": "30",
      "02": "40"
   }
}

(注:你给出的目标输出里有个小笔误,"02", "40"应该改成"02": "40",我已经帮你修正啦)

接下来就是核心的JSONata表达式,直接用它就能完成转换:

$groupBy($, function($v) { $v.group }) ~> $map(function($v, $k) {
  $v ~> $reduce(function($acc, $item) {
    $acc{$item.month: $item.value}
  }, {})
})

我给你拆解一下这个表达式的逻辑:

  1. 第一步:按group分组
    用$groupBy($, function($v) { $v.group })把原数组按每个对象的group字段值分组,这一步会得到一个中间结构:键是group的值(比如"a"、"b"),值是对应group下的所有对象组成的数组。
  2. 第二步:重构每个分组的内部结构
    用$map遍历每个分组,对每个分组的对象数组,再用$reduce来逐个处理数组里的对象:把每个对象的month作为新对象的键,value作为对应的值,逐步合并成一个扁平的对象。

你把这个表达式放到支持JSONata的工具里测试,代入你的输入JSON,就能直接得到你想要的目标结构啦~

备注:内容来源于stack exchange,提问作者Stuart Marsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 13:33:00