基于唯一标识字段的JQ递归去重与合并JSON对象方案问询
基于ID字段的JSON对象递归去重与合并需求
我需要基于每个JSON对象中的ID字段,对多个JSON对象执行去重与合并操作。以下示例中,将通过employee.id和hobbygroup.id字段的值判断是移除重复项,还是在保留层级结构的前提下合并不同值:
{ "employee":[ { "employee.id":"11", "employee.name":"bob", "hobbygroup":{ "hobbygroup.id":"1", "hobbygroup.name":"chess", "groupmeeting":{ "groupmeeting.id":"a", "groupmeeting.name":"kickoff meeting" } } }, { // 新的hobbygroup.id,将与上方hobbygroup "1" 合并为数组 "employee.id":"11", "employee.name":"bob", "hobbygroup":{ "hobbygroup.id":"2", "hobbygroup.name":"boxing", "groupmeeting":{ "groupmeeting.id":"a", "groupmeeting.name":"kickoff meeting" } } }, { // employee.id和hobbygroup.id与之前一致,但groupmeeting为新项,将与groupmeeting "a" 合并为数组 "employee.id":"11", "employee.name":"bob", "hobbygroup":{ "hobbygroup.id":"2", "hobbygroup.name":"boxing", "groupmeeting":{ "groupmeeting.id":"b", "groupmeeting.name":"second meeting" } } }, { // employee.id和hobbygroup.id均重复,将被去重忽略 "employee.id":"11", "employee.name":"bob", "hobbygroup":{ "hobbygroup.id":"2", "hobbygroup.name":"boxing" } }, { // 新的employee.id,将与employee 11合并为数组 "employee.id":"12", "employee.name":"bill", "hobbygroup":{ "hobbygroup.id":"1", "hobbygroup.name":"chess", "groupmeeting":{ "groupmeeting.id":"a", "groupmeeting.name":"kickoff meeting" } } } ] }
预期返回结果
{ "employee":[ { "employee.id":"11", "employee.name":"bob", "hobbygroup":[ { "hobbygroup.id":"1", "hobbygroup.name":"chess", "groupmeeting":{ "groupmeeting.id":"a", "groupmeeting.name":"kickoff meeting" } }, { "hobbygroup.id":"2", "hobbygroup.name":"boxing", "groupmeeting":[ { "groupmeeting.id":"a", "groupmeeting.name":"kickoff meeting" }, { "groupmeeting.id":"b", "groupmeeting.name":"second meeting" } ] } ] }, { "employee.id":"12", "employee.name":"bill", "hobbygroup":{ "hobbygroup.id":"11", "hobbygroup.name":"chess", "groupmeeting":{ "groupmeeting.id":"a", "groupmeeting.name":"kickoff meeting" } } } ] }
示例说明
- 在第一层级,若两个对象的
employee.id值匹配:- 对象的子字段(如
employee.name)将被去重/覆盖; - 子对象(如
hobbygroup)需检查其对应ID字段(hobbygroup.id)是否匹配:- 若匹配,则对该对象递归应用上述规则(合并字段,再处理子对象的子层级);
- 若不匹配,则将这两个hobbygroup对象合并为父对象(employee)下的数组,格式为
"hobbygroup": [{chess...}, {boxing...}]
- 对象的子字段(如
潜在输入特性
- 输入JSON可包含任意层级的嵌套结构;
- 每个对象都有一个去重键字段(如示例中的
employee.id和hobbygroup.id),可预先统一重命名为key.id以简化处理; - 解决方案需具备通用性,支持递归处理,无需预先知晓字段名称或嵌套结构。
当前尝试
我已经找到一些关于合并JSON对象的讨论,其中有实现类似递归合并乘法操作(*)的函数,但遇到数组时会直接合并。我觉得可以在此基础上增加ID字段的条件判断(仅当ID不匹配时才合并为数组),但因为刚接触JQ,想找更简洁的声明式解决方案,特此求助。
内容的提问来源于stack exchange,提问作者pizzathehut
相关产品推荐
相关产品推荐

