O JSON define um array (em português, um vetor) como:
Um array é uma coleção ordenada de valores. Um array começa com
[, o parêntese reto de abertura, e termina com], o parêntese reto de fecho. Os valores são separados por,, uma vírgula.
Os arrays podem conter zero ou mais valores JSON de qualquer tipo. Os elementos de um array não precisam de ser todos do mesmo tipo.
Usa parênteses retos para reunir elementos num array.
[1, 2, 3]
Os elementos de um stream podem ser capturados num array envolvendo-o em parênteses retos.
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
A função length devolve o número de elementos de um array.
A indexação de arrays começa em zero.
Obtém um elemento de um array com uma expressão entre parênteses retos:
.[2] obtém o terceiro elemento.
Os índices negativos contam de trás para a frente a partir do fim do array:
.[-1] obtém o último elemento; .[-2] é o penúltimo.
Uma fatia é uma subsequência do array.
.[10:15] devolve 5 elementos a partir do índice 10; o índice final não é incluído.
Existem ainda algumas funções de conveniência:
first obtém o primeiro elemento.last obtém o último elemento.nth(n) obtém o elemento no índice n.O jq fornece muitas funções para as tarefas de iteração mais comuns:
map(expr) devolve um novo array em que a expr é aplicada a cada elemento, um a um.
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
select(expr) é uma função que aplica a expr a um único valor;
se o resultado da expressão for verdadeiro, o valor é devolvido;
se o resultado for falso, nada é devolvido: não null, mas mesmo nada.
Para aplicar isso a um array, combina-a com map.
[range(10)] | map(select(. % 2 == 0)) # => [0, 2, 4, 6, 8]
Em alternativa, aplica select a um stream e recolhe os resultados.
[range(10) | select(. % 2 == 0)] # => [0, 2, 4, 6, 8]
any(condition) e all(condition) devolvem um valor Boolean que indica se algum dos elementos do array passa a condição, ou se todos passam.
[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
És um observador de aves entusiasta que mantém registo de quantas aves visitaram o teu jardim nos últimos sete dias.
Tens cinco tarefas, todas relacionadas com o número de aves que visitaram o teu jardim.
Guardas as contagens de aves em formato JSON. Um array principal armazena arrays de contagens semanais. Cada contagem semanal é um array de sete números inteiros, um número por cada dia da semana. Acrescentas sempre as novas semanas ao fim do array principal. Implementa o filtro que devolve as contagens da semana passada.
$ 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 o filtro que devolve quantas aves visitaram o teu jardim ontem. As contagens de aves estão ordenadas por dia: o primeiro elemento é a contagem do dia mais antigo e o último elemento é a contagem de hoje.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"yesterday": 4,
...
Implementa o filtro que devolve o número total de aves que visitaram o teu jardim esta semana.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"total": 44,
...
Há dias mais movimentados do que outros. Um dia movimentado é aquele em que cinco ou mais aves visitaram o teu jardim. Implementa o filtro que devolve o número de dias movimentados esta semana.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"busy_days": 4,
...
Implementa o filtro que devolve true se, esta semana, houve algum dia em que zero aves visitaram o teu jardim; caso contrário, devolve false.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"has_day_without_birds": false
}
Inscreve-te no Exercism para aprenderes e dominares jq com 12 conceitos75 exercícios, e mentoria humana real, tudo grátis.