Tracks
/
jq
jq
/
Temario
/
Arrays
Ar

Arrays en jq

5 ejercicios

Acerca de Arrays

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.

Crear arrays

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]

Tamaño

La función length devuelve la cantidad de elementos de un array.

Indexación y segmentos

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.

Convertir a un flujo de elementos

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

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 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
    

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; 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

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

  • 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

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

Aprende Arrays

La práctica está bloqueada

Desbloquea 8 ejercicios más para practicar Arrays