JSON define un array como:
Un array es una colección ordenada de valores. Un array empieza por el corchete izquierdo
[y termina con el corchete derecho]. Los valores se separan con una coma,.
Los arrays pueden contener cero o más valores JSON de cualquier tipo. No es necesario que todos los elementos de un array sean del mismo tipo.
Usa corchetes para reunir elementos en un array.
[1, 2, 3]
Los elementos de un stream 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 el número de elementos de un array.
La indexación de arrays empieza en cero.
Recupera 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 de conveniencia:
first obtiene el primer elemento.last obtiene el último elemento.nth(n) obtiene el elemento que está en el índice n.Hay circunstancias en las que queremos obtener un stream con los elementos de un array uno a uno.
Para ello usamos .[].
Supongamos que queremos un stream 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 pueden colocarse 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 habitual:
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 único 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, sino nada en absoluto.
Para aplicarlo a un array, combínalo con map.
[range(10)] | map(select(. % 2 == 0)) # => [0, 2, 4, 6, 8]
Como alternativa, aplica select a un stream y recoge los resultados.
[range(10) | select(. % 2 == 0)] # => [0, 2, 4, 6, 8]
any(condition) y all(condition) devuelven un valor booleano según si alguno o todos los elementos del array cumplen la condición.
[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;
en caso 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 stream.
"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 del elemento con su índice.
Python tiene enumerate.
jq tiene algo parecido, llamado to_entries.
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