如何使用jq反转JSON数据结构并生成水果对应喜爱者数组?
用JQ反转JSON数据结构:按水果分组统计喜爱者
原始输入JSON
[ { "name": "Trevor", "fruits": ["apple", "banana"] }, { "name": "Lily", "fruits": ["apple", "haribo"] } ]
预期输出JSON
[ { "fruit": "apple", "liked_by": ["Trevor", "Lily"] }, { "fruit": "banana", "liked_by": ["Trevor"] }, { "fruit": "haribo", "liked_by": ["Lily"] } ]
你的命令问题分析
当前尝试的JQ命令存在两个核心问题:
- 语法错误:
{"name": $name, "liked_by": += [.]不符合JQ对象字面量的语法规则,不能直接在对象内使用+=操作符 - 缺少聚合逻辑:仅拆解了用户与水果的对应关系,但没有对相同水果的喜爱者进行分组合并
正确的JQ解决方案
方案1:分组聚合写法
jq ' # 拆解为单个水果-用户的对应对象 .[] | .name as $name | .fruits[] | {fruit: ., liked_by: [$name]} # 按水果名称分组 | group_by(.fruit) # 合并每组的用户数组并整理结构 | map({ fruit: .[0].fruit, liked_by: [.[].liked_by[]] }) ' input.json
方案2:Reduce高效写法(更适合大数据量)
jq ' # 双层reduce构建水果到用户的映射 reduce .[] as $user ({}; reduce $user.fruits[] as $fruit (.; .[$fruit] += [$user.name] ) ) # 将映射转换为预期的数组结构 | to_entries | map({fruit: .key, liked_by: .value}) ' input.json
逻辑说明
两种方案的核心都是先建立水果-用户的关联关系,再将相同水果的用户合并为数组:
- 方案1先拆解所有离散关联,再通过
group_by分组后合并数组 - 方案2通过
reduce直接构建水果到用户数组的映射,再转换为目标格式
内容的提问来源于stack exchange,提问作者joepd
相关产品推荐
相关产品推荐

