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

使用JQ扁平化数组键时出现笛卡尔积问题求助

问题:JSON字段重命名时出现笛卡尔积问题

原始JSON数据:

{
  "name": "vehicles",
  "details": [
    {
      "type": "passenger",
      "engine": {
        "type": "electric"
      }
    },
    {
      "type": "commercial",
      "engine": {
        "type": "diesel"
      }
    }
  ]
}

需求是将每个details元素中的engine.type字段重命名为engineType,同时删除原有的engine.type字段。

尝试执行的错误命令:

echo $json|jq '(.details[].engineType = .details[].engine.type)|del(.details[].engine.type)'

得到的错误结果(笛卡尔积输出):

{
  "name": "vehicles",
  "details": [
    {
      "type": "passenger",
      "engine": {},
      "engineType": "electric"
    },
    {
      "type": "commercial",
      "engine": {},
      "engineType": "electric"
    }
  ]
}
{
  "name": "vehicles",
  "details": [
    {
      "type": "passenger",
      "engine": {},
      "engineType": "diesel"
    },
    {
      "type": "commercial",
      "engine": {},
      "engineType": "diesel"
    }
  ]
}

解决方法

问题核心在于原始命令中,.details[].engineType = .details[].engine.type会遍历所有details元素的engine.type值,并将每个值赋值给所有details元素的engineType字段,从而产生笛卡尔积。正确的做法是对每个details元素单独处理:

方法1:使用|=操作符逐个处理数组元素

echo "$json" | jq '.details[] |= (.engineType = .engine.type | del(.engine.type))'

方法2:重新构造details数组

echo "$json" | jq '.details = [.details[] | .engineType = .engine.type | del(.engine.type)]'

执行任一命令后,都会得到正确输出:

{
  "name": "vehicles",
  "details": [
    {
      "type": "passenger",
      "engine": {},
      "engineType": "electric"
    },
    {
      "type": "commercial",
      "engine": {},
      "engineType": "diesel"
    }
  ]
}

如果希望连空的engine对象也一起删除,可以调整命令为:

echo "$json" | jq '.details[] |= (.engineType = .engine.type | del(.engine))'

输出结果:

{
  "name": "vehicles",
  "details": [
    {
      "type": "passenger",
      "engineType": "electric"
    },
    {
      "type": "commercial",
      "engineType": "diesel"
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:31:14