JSON définit un tableau ainsi :
Un tableau est une collection ordonnée de valeurs. Un tableau commence par
[crochet ouvrant et se termine par]crochet fermant. Les valeurs sont séparées par,virgule.
Un tableau peut contenir zéro ou plusieurs valeurs JSON de n'importe quel type. Les éléments d'un tableau n'ont pas besoin d'être tous du même type.
Utilise des crochets pour rassembler des éléments dans un tableau.
[1, 2, 3]
Les éléments d'un stream peuvent être capturés dans un tableau en l'entourant de crochets.
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
La fonction length renvoie le nombre d'éléments d'un tableau.
L'indexation des tableaux commence à zéro.
Récupère un élément d'un tableau avec une expression entre crochets :
.[2] donne le troisième élément.
Les indices négatifs se comptent à rebours depuis la fin du tableau :
.[-1] donne le dernier élément ; .[-2] donne l'avant-dernier.
Un slice est une sous-séquence du tableau.
.[10:15] renvoie 5 éléments à partir de l'indice 10 ; l'indice de fin n'est pas inclus.
Il existe quelques fonctions pratiques :
first donne le premier élément.last donne le dernier élément.nth(n) donne l'élément à l'indice n.jq fournit de nombreuses fonctions pour couvrir les besoins courants d'itération :
map(expr) renvoie un nouveau tableau où expr est appliqué à chaque élément tour à tour.
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
select(expr) est une fonction qui applique expr à une valeur unique ;
si le résultat de l'expression vaut vrai, alors la valeur est renvoyée ;
si le résultat vaut faux, rien n'est renvoyé, pas null, vraiment rien.
Pour l'appliquer à un tableau, combine-le avec map.
[range(10)] | map(select(. % 2 == 0)) # => [0, 2, 4, 6, 8]
Autrement, applique select à un stream et rassemble les résultats.
[range(10) | select(. % 2 == 0)] # => [0, 2, 4, 6, 8]
any(condition) et all(condition) renvoient une valeur booléenne indiquant si au moins un ou tous les éléments du tableau satisfont la condition.
[1, 2, 3, 4] | any(. > 4) # false
[1, 2, 3, 4] | any(. >= 4) # true
[1, 2, 3, 4] | all(. >= 4) # false
[1, 2, 3, 4] | all(. <= 4) # true
Tu es un observateur d'oiseaux passionné qui gardes trace du nombre d'oiseaux qui ont visité ton jardin ces sept derniers jours.
Tu as cinq tâches, toutes portant sur le nombre d'oiseaux qui ont visité ton jardin.
Tu stockes tes comptages d'oiseaux au format JSON. Un tableau « main » contient des tableaux de comptages hebdomadaires. Chaque comptage hebdomadaire est un tableau de sept entiers, un nombre pour chaque jour de la semaine. Tu ajoutes toujours les nouvelles semaines à la fin du tableau « main ». Implémente le filtre qui renvoie les comptages de la semaine dernière.
$ cat bird-counting-data.json
[
...,
[0, 2, 5, 3, 7, 8, 4],
[4, 5, 9, 10, 9, 4, 3]
]
$ jq -f bird-count.jq < bird-counting-data.json
{
"last_week": [0, 2, 5, 3, 7, 8, 4],
...
Implémente le filtre pour renvoyer le nombre d'oiseaux qui ont visité ton jardin hier. Les comptages sont ordonnés par jour : le premier élément correspond au comptage du jour le plus ancien, et le dernier à celui d'aujourd'hui.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"yesterday": 4,
...
Implémente le filtre pour renvoyer le nombre total d'oiseaux qui ont visité ton jardin cette semaine.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"total": 44,
...
Certains jours sont plus chargés que d'autres. Un jour chargé est un jour où cinq oiseaux ou plus ont visité ton jardin. Implémente le filtre pour renvoyer le nombre de jours chargés cette semaine.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"busy_days": 4,
...
Implémente le filtre qui renvoie true s'il y a eu cette semaine un jour où aucun oiseau n'est venu dans le jardin ; sinon, renvoie false.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"has_day_without_birds": false
}
Inscris-toi sur Exercism pour apprendre et maîtriser jq avec 12 concepts75 exercices, et un vrai mentorat humain, le tout gratuitement.