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

如何使用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命令存在两个核心问题:

  1. 语法错误:{"name": $name, "liked_by": += [.] 不符合JQ对象字面量的语法规则,不能直接在对象内使用+=操作符
  2. 缺少聚合逻辑:仅拆解了用户与水果的对应关系,但没有对相同水果的喜爱者进行分组合并

正确的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. 方案1先拆解所有离散关联,再通过group_by分组后合并数组
  2. 方案2通过reduce直接构建水果到用户数组的映射,再转换为目标格式

内容的提问来源于stack exchange,提问作者joepd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:56:15