簡體   English   中英

從嵌套的對象數組中選擇屬性的子集

[英]Selecting a subset of properties from nested array of objects

我有一個深度嵌套的對象數組,我試圖從中提取鍵和值的子集。

[
    {
        "x": {
          "y": {
            "description": "jq rocks",
            "z": [
              {
                "data_1": 123,
                "data_2": [
                  {
                    "field_1": true,
                    "field_2": "hello",
                    "field_3": "red"
                  }
                ]
              },
              {
                "data_1": 123,
                "data_2": [
                  {
                    "field_1": true,
                    "field_2": "goodbye",
                    "field_3": "blue"
                  }
                ]
              },
              {
                "data_1": 123
              }
            ]
          }
        }
    }
]

我正在嘗試提取 field_2 和 field_3,以及其他一些字段,但我遇到的問題是它似乎結合了 field_2 和 field_3 的所有可能組合。

我目前使用的 jq 是

jq '.[] | {
  "description": .x.y.description,
  "subset": [{
     "f_2": .x.y.z[].data_2[]?.field_2,
     "f_3": .x.y.z[].data_2[]?.field_3
  }]
}' tmp.json

使用上面的示例時,它會在數組中返回 4 個條目,而不僅僅是兩個。

"subset": [
  {
    "f_2": "hello"
    "f_3": "red"
  }
  {
    "f_2": "hello"
    "f_3": "blue"
  }
  {
    "f_2": "goodbye"
    "f_3": "red"
  }
  {
    "f_2": "goodbye"
    "f_3": "blue"
  }
]

如何強制 jq 處理 data_2 數組中的每個 object 一次?

您可以使用以下內容:

.[].x.y | { description, subset: [.z[].data_2[]? | { f_2: .field_2, f_3: .field_3 }] }

在這里試試

您的問題源於基於同一 object 中的兩次迭代定義兩個字段。 [{foo: .xyz[].data_2[]?.field_2}]返回兩個項目,但是[{foo: .xyz[].data_2[]?.field_2, bar: .xyz[].data_2[]?.field_3}]返回 4。分解迭代可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM