Выбор подмножества свойств из вложенного массива объектов - PullRequest
0 голосов
/ 18 октября 2019

У меня есть глубоко вложенный массив объектов, из которого я пытаюсь получить подмножество ключей и значений.

[
    {
        "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, а также некоторые другие поля, но проблема IЯ сталкиваюсь с тем, что он, кажется, объединяет все возможные комбинации 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 один раз?

1 Ответ

2 голосов
/ 18 октября 2019

Вы можете использовать следующее:

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

Попробуйте здесь .

Ваша проблема связана с определением двух полей на основе двух итераций в одном и том же объекте. [{foo: .x.y.z[].data_2[]?.field_2}] возвращает два элемента, но [{foo: .x.y.z[].data_2[]?.field_2, bar: .x.y.z[].data_2[]?.field_3}] возвращает 4. Факторизация итерации решает проблему.

...