Как мне отфильтровать JSON с помощью jq, основываясь на том, находится ли значение атрибута в массиве? - PullRequest
0 голосов
/ 14 ноября 2018

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

У меня есть кое-что, что работает, но если это похоже на кучу.Есть ли более аккуратный способ сделать это?

Вход

{"potato":4}

Фильтр

select(.potato as $k | ([1,2,3,4] | any(. == $k)))

Выход

{
  "potato": 4
}

jqplay link https://jqplay.org/s/Ts97jkk21K

1 Ответ

0 голосов
/ 14 ноября 2018

Кажется ли это меньше, чем бред?

[1,2,3,4] as $acceptable
| .potato as $k
| select( any($acceptable[];  . == $k) )

Если ваш jq имеет IN/1, вы можете пропустить $k:

[1,2,3,4] as $acceptable
| select(.potato | IN($acceptable[]))

Этот стиль позволяет легко передавать $acceptable в качестве параметра командной строки, например.

Искушение

Легко поддаться искушению простотой решения только для выбора, такого как:

[1,2,3,4] as $acceptable
| select($acceptable[] == .potato)

Это было бы хорошо при определенных обстоятельствах, например, если $acceptable является коротким и не содержит дубликатов (при условии, что мы хотим семантику any). Но any и IN имеют семантику короткого замыкания, которая может быть желательна, например для эффективности.

...