Выбор в JQ с Содержит в массиве - PullRequest
0 голосов
/ 23 января 2019

Я хочу выбрать конкретный предмет из массива, используя Contains, и получить первый предмет, используя JQ.

JQ:

  .amazon.items[] | select(.name | contains ("shoes")) 

JSON:

  {
    "amazon": {
      "activeitem": 2,
      "items": [
        {
          "id": 1,
          "name": "harry potter",
          "state": "sold"
        },
        {
          "id": 2,
          "name": "adidas shoes",
          "state": "in inventory"
        },
        {
          "id": 3,
          "name": "watch",
          "state": "returned"
        },{
          "id": 4,
          "name": "adidas shoes",
          "state": "in inventory"
        }
      ]
    }
  } 

Ожидаемый результат:

    {
      "activeitem": 2,
      "item": {
        "id": 2,
        "name": "adidas shoes",
        "state": "in inventory"
      }
    }

Факт:

Пробовал различные варианты, например, но не получил ожидаемый ответ.

  1. .amazon.items [] |выберите (.name | содержит ("обувь"))
  2. .amazon.items |выберите (. []. имя | содержит ("обувь")) |. [0]

Также, когда я пытаюсь объединить activeitem и Item, я получаю что-то вроде этого, что также неправильно.

    {
      "activeitem": 2,
      "item": {
        "id": 2,
        "name": "adidas shoes",
        "state": "in inventory"
      }
    },
      {
      "activeitem": 2,
      "item": {
        "id": 2,
        "name": "adidas shoes",
        "state": "in inventory"
      }
    }

1 Ответ

0 голосов
/ 24 января 2019

Чтобы отредактировать «на месте», вы можете написать:

.amazon
| .items |= map(select(.name | contains ("shoes")))[0]

Если вы действительно хотите изменить имя «items» на «item», вы можете настроить вышеперечисленное следующим образом:

.amazon
| .item = (.items | map(select(.name | contains ("shoes")))[0])
| del(.items)
...