JSON definisce un array come:
Un array è una raccolta ordinata di valori. Un array inizia con la parentesi quadra aperta
[e termina con la parentesi quadra chiusa]. I valori sono separati da una 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 racchiudendolo 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 in un array.
L'indicizzazione degli array parte da zero.
Per recuperare un elemento da un array usa un'espressione tra parentesi quadre:
.[2] ottiene il terzo elemento.
Gli indici negativi contano all'indietro a partire dalla fine dell'array:
.[-1] ottiene l'ultimo elemento; .[-2] è il penultimo.
Una slice è una sottosequenza 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.In certi casi vogliamo ottenere gli elementi di un array come uno stream, uno alla volta.
Per farlo usiamo .[].
Supponiamo di volere uno stream con le lunghezze delle stringhe presenti in un array.
["a", "be", "cat", "door"] | length # => 4 -- the number of elements in the array
["a", "be", "cat", "door"] | .[] | length # => 1, 2, 3, 4 -- the lengths of each element
Le parentesi vuote possono essere messe accanto all'espressione precedente, omettendo la pipe.
["a", "be", "cat", "door"][] | length # => 1, 2, 3, 4 -- the lengths of each element
# ........................^^
Usa + per concatenare gli array.
[1, 2, 3] + [4, 5] # => [1, 2, 3, 4, 5]
L'operatore - rimuove dall'array di sinistra gli elementi presenti nell'array di destra.
[range(10)] - [2, 4, 6] # => [0, 1, 3, 5, 7, 8, 9]
jq fornisce molte funzioni che coprono le funzionalità di iterazione più comuni:
map(expr) restituisce un nuovo array in cui expr viene applicata a ogni elemento, uno alla volta.
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
select(expr) è una funzione che applica expr a un singolo valore;
se il risultato dell'espressione è vero, il valore viene restituito;
se il risultato è falso, non viene restituito nulla: non null, davvero nulla.
Per applicarla a un array, combinala 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 soddisfano 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
Possiamo verificare che un array contenga un elemento con index.
Questa funzione restituisce l'indice dell'elemento dato se è presente nell'array;
altrimenti restituisce null.
["carrots", "beef", "potatoes"] | index("beef") # => 1
["carrots", "beef", "potatoes"] | index("bees") # => null
Esiste una funzione inversa chiamata IN (sì, tutta in maiuscolo).
La particolarità di IN è che il suo argomento non è un array, ma uno stream.
"beef" | IN(["carrots", "beef", "potatoes"][]) # => true
"bees" | IN(["carrots", "beef", "potatoes"][]) # => false
Ruby ha un comodo metodo each_with_index che abbina il valore dell'elemento al suo indice.
Python ha enumerate.
jq ha qualcosa di simile, chiamato to_entries.
Trasforma l'array in un array di oggetti {key: index, value: value}.
[11, 22, 33, 44] | to_entries
# => [{key: 0, value: 11}, {key: 1, value: 22}, {key: 2, value: 33}, {key: 3, value: 44}]
sort e sort_by
group_by
min, max, min_by, max_by
unique, unique_by
flatten