使用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} }, {}) })
我给你拆解一下这个表达式的逻辑:
- 第一步:按group分组
用$groupBy($, function($v) { $v.group })把原数组按每个对象的group字段值分组,这一步会得到一个中间结构:键是group的值(比如"a"、"b"),值是对应group下的所有对象组成的数组。 - 第二步:重构每个分组的内部结构
用$map遍历每个分组,对每个分组的对象数组,再用$reduce来逐个处理数组里的对象:把每个对象的month作为新对象的键,value作为对应的值,逐步合并成一个扁平的对象。
你把这个表达式放到支持JSONata的工具里测试,代入你的输入JSON,就能直接得到你想要的目标结构啦~
备注:内容来源于stack exchange,提问作者Stuart Marsh
相关产品推荐
相关产品推荐

