Как отфильтровать массив объектов по значениям свойств элемента с помощью jq?

Мне нравится фильтровать файлы JSON, используяJQ:

jq . some.json

Учитывая json, содержащий массив объектов:

{
  "theList": [
    {
      "id": 1,
      "name": "Horst"
    },
    {
      "id": 2,
      "name": "Fritz"
    },
    {
      "id": 3,
      "name": "Walter"
    },
    {
      "id": 4,
      "name": "Gerhart"
    },
    {
      "id": 5,
      "name": "Harmut"
    }
  ]
}

Я хочу отфильтровать этот список, чтобы показать только элементы с идентификатором, имеющим значения 2 и 4, поэтому ожидаемый результат:

{
  "id": 2,
  "name": "Fritz"
},
{
  "id": 4,
  "name": "Gerhart"
}

Как мне отфильтровать JSON с помощью JQ? Я поиграл с select и map, но ни один из них не заработал, например:

$ jq '.theList[] | select(.id == 2) or select(.id == 4)' array.json
true
 T.J. Crowder30 июн. 2016 г., 13:28
Пожалуйста, обратите внимание: Вопрос оJQ, не JQuery.
 k0pernikus30 июн. 2016 г., 13:31
@ T.J.Crowder YMMD ^^ И я уточнил в вопросе: D

Ответы на вопрос(2)

Решение Вопроса

Из документов:

jq '.[] | select(.id == "second")' 

вход [{"id": "first", "val": 1}, {"id": "second", "val": 2}]

Выход {"id": "second", "val": 2}

Я думаю, что вы можете сделать что-то вроде этого:

jq '.theList[] | select(.id == 2 or .id == 4)' array.json
 k0pernikus30 июн. 2016 г., 16:05
jq '.theList[] | select(.id == 2 or .id == 4)' array.json сделал свое дело, вы можете обновить свой ответ :)
 k0pernikus30 июн. 2016 г., 15:49
jq '.theList[] | select(.id == 2) or select(.id == 4)' array.json дает в:true o.o
 André Senra30 июн. 2016 г., 16:02
Он возвращает оценку обоих предложений, попробуйте это:jq '.theList[] | select(.id == 2 or .id == 4)'

Вы могли бы использоватьselect вmap.

.theList | map(select(.id == (2, 4)))

Или более компактный:

[ .theList[] | select(.id == (2, 4)) ]

Хотя написано, что это немного неэффективно, так как выражение дублируется для каждого сравниваемого значения. Это будет более эффективно и, возможно, более читабельно написано так:

[ .theList[] | select(any(2, 4; . == .id)) ]
 jq17072728 авг. 2017 г., 02:30

Ваш ответ на вопрос