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

使用jq的map或from_entries格式化对象数组的技术求助

正确的jq写法实现JSON转换需求

原始输入JSON

{
    "result": [
        {
            "name": "Fields",
            "listFields": [
                [
                    "apple"
                ],
                [
                    "Banana__c"
                ]
            ],                    
            "fields": [
                {
                    "name": "apple",
                    "displayName": "Apple",
                    "color": "red",
                    "price": 20
                },
                {
                    "name": "Banana__c",
                    "displayName": "Banana",
                    "color": "yellow",
                    "price": 18
                }
            ]
        }
    ],
    "success": true
}

期望输出JSON

{
   "fields": [
      "apple",
      "Banana__c"
   ],
   "Brand": "Kroger",
   "fruitNames": {
      "apple": "Apple",
      "Banana__c": "Banana"
   }
}

错误代码问题说明

你之前尝试的两段代码存在语法或逻辑错误:

  • 第一段:对象构造时fruitNames后缺少冒号,且未正确定位到.result数组内的元素,合并对象的语法不符合jq规范
  • 第二段:生成的键名格式不符合需求,且未构建出目标结构的三个字段

正确jq代码及解释

写法一(map + add)

.result[] | {
  fields: [.fields[].name],
  Brand: "Kroger",
  fruitNames: (.fields | map({(.name): .displayName}) | add)
}

写法二(reduce遍历构建)

.result[] | {
  fields: [.fields[].name],
  Brand: "Kroger",
  fruitNames: reduce .fields[] as $f ({}; .[$f.name] = $f.displayName)
}

代码解释

  1. .result[]:遍历外层result数组,取出数组内的目标对象
  2. fields: [.fields[].name]:从对象的fields数组中提取每个元素的name字段,组成新的数组
  3. Brand: "Kroger":直接添加固定值字段
  4. fruitNames字段:
    • 写法一中,先用map将每个fields元素转换为{name: displayName}格式的单个对象,再用add合并成一个完整的键值对对象
    • 写法二中,用reduce遍历fields数组,初始化空对象,逐个将name作为键、displayName作为值存入对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:11:16