Comment filtrer le tableau d'objets en propriété d'élément de valeurs à l'aide jq?
J'aime filtre des fichiers json à l'aide de jq:
jq . some.json
Donné le json contenant un tableau d'objets:
{
"theList": [
{
"id": 1,
"name": "Horst"
},
{
"id": 2,
"name": "Fritz"
},
{
"id": 3,
"name": "Walter"
},
{
"id": 4,
"name": "Gerhart"
},
{
"id": 5,
"name": "Harmut"
}
]
}
Je veux filtrer la liste pour afficher uniquement les éléments avec id d'avoir la valeur 2 et 4, de sorte que le résultat attendu est:
{
"id": 2,
"name": "Fritz"
},
{
"id": 4,
"name": "Gerhart"
}
Comment puis-je filtrer le json à l'aide de jq? J'ai joué un peu avec le sélectionner et carte, mais n'a pas obtenu un de ceux à l'œuvre, par exemple:
$ jq '.theList[] | select(.id == 2) or select(.id == 4)' array.json
true
- tout le monde veuillez noter: La question est à propos de jq, pas jQuery.
- YMMD ^^ Et j'ai précisé dans la question 😀
Vous devez vous connecter pour publier un commentaire.
De la documentation:
Je pense que vous pouvez faire quelque chose comme ceci:
jq '.theList[] | select(.id == 2) or select(.id == 4)' array.json
rendements:true
o.Ojq '.theList[] | select(.id == 2 or .id == 4)'
jq '.theList[] | select(.id == 2 or .id == 4)' array.json
a fait le tour, vous pouvez mettre à jour votre réponse 🙂Vous pouvez utiliser
select
dansmap
.Ou plus compact:
Bien qu'écrit de cette façon est un peu inefficace car l'expression est dupliqué pour chaque valeur de l'objet de la comparaison. Ça va être plus efficace et peut-être plus lisible écrit de cette manière:
À l'aide de
select(.id == (2, 4))
ici est généralement inefficace (voir ci-dessous).Si votre jq a
IN/1
, alors il peut être utilisé pour obtenir une solution plus efficace:Si votre jq n'a pas
IN/1
, puis vous pouvez définir comme suit:Efficacité
Une façon de voir l'inefficacité est d'utiliser
debug
. L'expression suivante, par exemple, les résultats dans 10 appels àdebug
, alors que seulement 9 vérifie l'égalité sont effectivement nécessaires:index/1
En principe, à l'aide de
index/1
doit être efficace, mais comme d'écrire ces lignes (octobre 2017), sa mise en œuvre, bien que rapide (c'est écrit en C), est inefficace.Voici une solution à l'aide de les indices: