JSON definisce un array come:
Un array è una raccolta ordinata di valori. Un array inizia con la parentesi quadra sinistra
[e finisce con la parentesi quadra destra]. I valori sono separati dalla virgola,.
Gli array possono contenere zero o più valori JSON di qualsiasi tipo. Gli elementi di un array non devono essere tutti dello stesso tipo.
Usa le parentesi quadre per raccogliere gli elementi in un array.
[1, 2, 3]
Gli elementi di uno stream possono essere raccolti in un array racchiudendoli tra parentesi quadre.
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
La funzione length restituisce il numero di elementi di un array.
L'indicizzazione degli array parte da zero.
Recupera un elemento da un array con un'espressione tra parentesi quadre:
.[2] ottiene il terzo elemento.
Gli indici negativi contano all'indietro dalla fine dell'array:
.[-1] ottiene l'ultimo elemento; .[-2] è il penultimo.
Una sezione (slice) è una sotto-sequenza dell'array.
.[10:15] restituisce 5 elementi a partire dall'indice 10; l'indice finale non è incluso.
Ci sono alcune funzioni di comodo:
first ottiene il primo elemento.last ottiene l'ultimo elemento.nth(n) ottiene l'elemento all'indice n.jq fornisce molte funzioni per coprire le funzionalità di iterazione più comuni:
map(expr) restituisce un nuovo array in cui l'expr viene applicato a ciascun elemento, uno alla volta.
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
select(expr) è una funzione che applica l'expr a un singolo valore;
se il risultato dell'espressione è vero, allora il valore viene restituito;
se il risultato è falso, non viene restituito nulla: non null, proprio nulla.
Per applicarlo a un array, combinalo con map.
[range(10)] | map(select(. % 2 == 0)) # => [0, 2, 4, 6, 8]
In alternativa, applica select a uno stream e raccogli i risultati.
[range(10) | select(. % 2 == 0)] # => [0, 2, 4, 6, 8]
any(condition) e all(condition) restituiscono un valore booleano che indica se uno o tutti gli elementi dell'array superano la condizione.
[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
Sei un appassionato birdwatcher che tiene traccia di quanti uccelli hanno visitato il tuo giardino negli ultimi sette giorni.
Hai cinque attività, tutte relative al numero di uccelli che hanno visitato il tuo giardino.
Memorizzi i tuoi conteggi degli uccelli in formato JSON. Un array "main" memorizza array di conteggi settimanali. Ogni conteggio settimanale è un array di sette numeri interi, un numero per ogni giorno della settimana. Aggiungi sempre le nuove settimane in fondo all'array "main". Implementa il filtro che restituisce i conteggi della scorsa settimana.
$ 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],
...
Implementa il filtro per restituire quanti uccelli hanno visitato il tuo giardino ieri. I conteggi degli uccelli sono ordinati per giorno: il primo elemento è il conteggio del giorno più vecchio, mentre l'ultimo è il conteggio di oggi.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"yesterday": 4,
...
Implementa il filtro per restituire il numero totale di uccelli che hanno visitato il tuo giardino questa settimana.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"total": 44,
...
Alcuni giorni sono più intensi di altri. Un giorno intenso è quello in cui cinque o più uccelli hanno visitato il tuo giardino. Implementa il filtro per restituire il numero di giorni intensi questa settimana.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"busy_days": 4,
...
Implementa il filtro che restituisce true se c'è stato un giorno questa settimana in cui zero uccelli hanno visitato il giardino; altrimenti, restituisci false.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"has_day_without_birds": false
}
Iscriviti a Exercism per imparare e padroneggiare jq con 12 concetti75 esercizi e il mentoring di persone reali, tutto gratis.