JSON define un array (o arreglo) como:
Un array es una colección ordenada de valores. Un array comienza con el corchete izquierdo
[y termina con el corchete derecho]. Los valores se separan por una coma,.
Los arrays pueden contener cero o más valores JSON de cualquier tipo. Los elementos del array no tienen que ser todos del mismo tipo.
Usa corchetes para reunir elementos en un array.
[1, 2, 3]
Los elementos de un flujo se pueden capturar en un array encerrándolo entre corchetes.
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
La función length devuelve la cantidad de elementos de un array.
La indexación de arrays empieza en cero.
Obtén un elemento de un array con una expresión entre corchetes:
.[2] obtiene el tercer elemento.
Los índices negativos cuentan hacia atrás desde el final del array:
.[-1] obtiene el último elemento; .[-2] es el penúltimo.
Un segmento es una subsecuencia del array.
.[10:15] devuelve 5 elementos a partir del índice 10; el índice final no se incluye.
Hay algunas funciones que te facilitan las cosas:
first obtiene el primer elemento.last obtiene el último elemento.nth(n) obtiene el elemento en el índice n.Hay ocasiones en las que queremos recorrer los elementos de un array uno por uno, como un flujo.
Para eso usamos .[].
Supongamos que queremos un flujo con las longitudes de los strings de 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
Los corchetes vacíos se pueden colocar junto a la expresión anterior, omitiendo la tubería.
["a", "be", "cat", "door"][] | length # => 1, 2, 3, 4 -- the lengths of each element
# ........................^^
Usa + para concatenar arrays.
[1, 2, 3] + [4, 5] # => [1, 2, 3, 4, 5]
El operador - elimina del array de la izquierda los elementos que están en el array de la derecha.
[range(10)] - [2, 4, 6] # => [0, 1, 3, 5, 7, 8, 9]
jq ofrece muchas funciones que cubren la funcionalidad de iteración más común:
map(expr) devuelve un array nuevo en el que expr se aplica a cada elemento por turno.
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
select(expr) es una función que aplica expr a un solo valor;
si el resultado de la expresión es verdadero, se devuelve el valor;
si el resultado es falso, no se devuelve nada, no null, en realidad nada.
Para aplicarlo a un array, combínalo con map.
[range(10)] | map(select(. % 2 == 0)) # => [0, 2, 4, 6, 8]
Otra opción es aplicar select a un flujo y reunir los resultados.
[range(10) | select(. % 2 == 0)] # => [0, 2, 4, 6, 8]
any(condition) y all(condition) devuelven un valor Boolean que indica si alguno de los elementos del array cumple la condición, o si la cumplen todos.
[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
Podemos comprobar si un array contiene un elemento con index.
Esta función devuelve el índice del elemento dado si está en el array;
de lo contrario, la función devuelve null.
["carrots", "beef", "potatoes"] | index("beef") # => 1
["carrots", "beef", "potatoes"] | index("bees") # => null
Hay una función inversa llamada IN (sí, en mayúsculas).
La particularidad de IN es que su argumento no es un array, sino un flujo.
"beef" | IN(["carrots", "beef", "potatoes"][]) # => true
"bees" | IN(["carrots", "beef", "potatoes"][]) # => false
Ruby tiene un práctico método each_with_index que empareja el valor de cada elemento con su índice.
Python tiene enumerate.
jq tiene algo parecido, llamado to_entries.
Este transforma el array en un array de objetos {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 y sort_by
group_by
min, max, min_by, max_by
unique, unique_by
flatten