【问题标题】:Fill arrays in the first input with elements from the second based on common field根据公共字段用第二个输入中的元素填充第一个输入中的数组
【发布时间】:2021-02-19 16:18:32
【问题描述】:

我有两个文件,我需要根据搜索 reference 字段将第二个文件的元素合并到第一个文件中的对象数组中。

第一个文件:

[
    {
        "reference": 25422,
        "order_number": "10_1",
        "details" : []
    },
    {
        "reference": 25423,
        "order_number": "10_2",
        "details" : []
    }
]

第二个文件:

[
    {
        "record_id" : 1,
        "reference": 25422,
        "row_description": "descr_1_0"
    },
    {
        "record_id" : 2,
        "reference": 25422,
        "row_description": "descr_1_1"
    },
    {
        "record_id" : 3,
        "reference": 25423,
        "row_description": "descr_2_0"
    }
]

我想得到:

[
    {
        "reference": 25422,
        "order_number": "10_1",
        "details" : [
            {
                "record_id" : 1,
                "reference": 25422,
                "row_description": "descr_1_0"
            },
            {
                "record_id" : 2,
                "reference": 25422,
                "row_description": "descr_1_1"
            }
        ]
    },
    {
        "reference": 25423,
        "order_number": "10_2",
        "details" :[
            {
                "record_id" : 3,
                "reference": 25423,
                "row_description": "descr_2_0"
            }
        ]
    }
]

以下是我在此命令启动的es_func.jq 文件中的代码:

jq -n --argfile f1 es_file1.json --argfile f2 es_file2.json -f es_func.jq
INDEX($f2[] ; .reference) as $details 
| $f1 
| map( ($details[.reference|tostring]| .row_description) as $vn 
| if $vn then .details = [{"row_description" : $vn}] else . end)

我只得到25422 引用中最后一条记录的结果,"row description": "descr_1_1" 没有"row_description": "descr_1_0"

[
  {
    "reference": 25422,
    "order_number": "10_1",
    "details": [
      {
        "row_description": "descr_1_1"
      }
    ]
  },
  {
    "reference": 25423,
    "order_number": "10_2",
    "details": [
      {
        "row_description": "descr_2_0"
      }
    ]
  }
]

我认为我已经接近解决方案,但仍然缺少一些东西。谢谢

【问题讨论】:

    标签: json jq


    【解决方案1】:

    如果您改用reduce,这会更容易。

    jq 'reduce inputs[] as $rec (INDEX(.reference);
      .[$rec.reference | tostring].details += [$rec]
    ) | map(.)' es_file1.json es_file2.json
    

    Online demo

    【讨论】:

      【解决方案2】:

      这是一个简单的、无需减少的解决方案:

      jq '
        group_by(.reference)
        | INDEX(.[]; .[0]|.reference|tostring) as $dict
        | input
        | map_values(. + {details: $dict[.reference|tostring]})
      ' 2.json 1.json 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 2018-02-23
        • 2022-07-16
        相关资源
        最近更新 更多