условно объединить два списка внутри объекта - PullRequest
1 голос
/ 01 апреля 2020

Hellow JQ экспертов!

Я учусь на JQ и имею json составленные списки объектов следующим образом:

{
  "image_files": [
    {
      "id": "img_0001",
      "width": 32,
      "heigt": 32,
      "file_name": "img_0001.png"
    },
    {
      "id": "img_0002",
      "width": 128,
      "heigt": 32,
      "file_name": "img_0002.png"
    },
    {
      "id": "img_0003",
      "width": 32,
      "heigt": 32,
      "file_name": "img_0003.png"
    },
    {
      "id": "img_0004",
      "width": 160,
      "heigt": 32,
      "file_name": "img_0004.png"
    }
  ],
  "annotations": [
    {
      "id": "ann_0001",
      "image_id": "img_0001",
      "label": "A",
      "attributes": {
        "type": "letter",
        "augmented": false
      }
    },
    {
      "id": "ann_0002",
      "image_id": "img_0002",
      "label": "Good",
      "attributes": {
        "type": "word",
        "augmented": false
      }
    },
    {
      "id": "ann_0003",
      "image_id": "img_0003",
      "label": "C",
      "attributes": {
        "type": "letter",
        "augmented": false
      }
    },
    {
      "id": "ann_0004",
      "image_id": "img_0004",
      "label": "Hello",
      "attributes": {
        "type": "word",
        "augmented": false
      }
    }
  ]
}
  • image_id в annotations список - это внешний ключ, ссылающийся на id в списке image_files.

Я хочу присоединиться к image_files и annotations с условием annotations.attribute.type == "letter".

Ожидается следующий выход:

{
  "letter_image_files_with_label": [
    {
      "id": "img_0001",
      "width": 32,
      "heigt": 32,
      "file_name": "img_0001.png",
      "label": "A"
    },
    {
      "id": "img_0003",
      "width": 32,
      "heigt": 32,
      "file_name": "img_0003.png",
      "label": "C"
    }
  ]
}

Как можно получить вышеуказанный результат при вводе данных json? join, объясненное в руководстве jq, похоже, не использует эту задачу. Есть ли способ для этого? Пожалуйста, покажите мне веревку.

Спасибо за ваше щедрое чтение.

1 Ответ

2 голосов
/ 01 апреля 2020

Индексирование image_files с id с делает это довольно тривиальным.

INDEX(.image_files[]; .id) as $imgs | [
  .annotations[]
  | select(.attributes.type == "letter")
  | $imgs[.image_id] + {label: .label}
]

Онлайн демо

...