Tracks
/
jq
jq
/
Temario
/
Arrays
Ar

Arrays en jq

5 ejercicios

Acerca de Arrays

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.

Crear arrays

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]

Tamaño

La función length devuelve el número de elementos de un array.

Indexación y segmentación

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.

Convertir en un stream de elementos

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
# ........................^^

Concatenar y restar

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]

Iterar

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
    

Pertenencia

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

Otras funciones (consulta el manual para más detalles)

  • 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

Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Arrays

La práctica está bloqueada

Desbloquea 8 ejercicios más para practicar Arrays