объединить два списка в объекте с общим состоянием, включая проверку длины - PullRequest
0 голосов
/ 01 апреля 2020

Здравствуйте, пользователи и эксперты 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 list является своего рода внешним ключом, ссылающимся на id в списке image_files.

Мой вопрос заключается в том, как объединить image_files и annotations с условием соединения

  • annotations.attributes.type == "word" AND
  • annotations.label 'length == 4.

Окончательный результат должен быть следующим:

{
  "four_letter_word_image_files_with_label": [
    {
      "id": "img_0002",
      "width": 128,
      "heigt": 32,
      "file_name": "img_0004.png"
      "label": "Good"
    }
  ]
}

How can I produce above result from the json data input?

Thanks for your reading.

1 Ответ

1 голос
/ 02 апреля 2020

Вот функция, с которой можно начать. Вы можете расширить его в соответствии со своими потребностями.

def Hongsoog:
  def makemap: reduce .annotations[] as $item ({}; .[$item.image_id]=$item) ;
  def join:    makemap as $idx | [ .image_files[] | { i:., a: $idx[.id] } ] ;
  def isword:  .a.attributes.type == "word" ;
  def islen4:  .a.label | length == 4 ;
  def format:  .i.label = .a.label | .i ; 
  def result:  [ join[] | select(isword and islen4) | format ];
  {
    "four_letter_word_image_files_with_label": result
  };

Hongsoog

Попробуйте онлайн!

...