Ar

Array in jq

5 esercizi

Informazioni su Array

JSON definisce un array come:

Un array è una raccolta ordinata di valori. Un array inizia con la parentesi quadra aperta [ e termina con la parentesi quadra chiusa ]. I valori sono separati da una virgola ,.

Gli array possono contenere zero o più valori JSON di qualsiasi tipo. Gli elementi di un array non devono essere tutti dello stesso tipo.

Creare array

Usa le parentesi quadre ([]) per raccogliere gli elementi in un array.

[1, 2, 3]

Gli elementi di uno stream possono essere raccolti in un array racchiudendolo tra parentesi quadre.

range(5)     # => a stream of 5 numbers
[range(5)]   # => the array [0, 1, 2, 3, 4]

Dimensione

La funzione length restituisce il numero di elementi in un array.

Indicizzazione e slicing

L'indicizzazione degli array parte da zero.

Per recuperare un elemento da un array usa un'espressione tra parentesi quadre: .[2] ottiene il terzo elemento.

Gli indici negativi contano all'indietro a partire dalla fine dell'array: .[-1] ottiene l'ultimo elemento; .[-2] è il penultimo.

Una slice è una sottosequenza dell'array. .[10:15] restituisce 5 elementi a partire dall'indice 10; l'indice finale non è incluso.

Ci sono alcune funzioni di comodo:

  • first ottiene il primo elemento.
  • last ottiene l'ultimo elemento.
  • nth(n) ottiene l'elemento all'indice n.

Convertire in uno stream di elementi

In certi casi vogliamo ottenere gli elementi di un array come uno stream, uno alla volta. Per farlo usiamo .[].

Supponiamo di volere uno stream con le lunghezze delle stringhe presenti in 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

Le parentesi vuote possono essere messe accanto all'espressione precedente, omettendo la pipe.

["a", "be", "cat", "door"][] | length      # => 1, 2, 3, 4 -- the lengths of each element
# ........................^^

Concatenare e sottrarre

Usa + per concatenare gli array.

[1, 2, 3] + [4, 5]          # => [1, 2, 3, 4, 5]

L'operatore - rimuove dall'array di sinistra gli elementi presenti nell'array di destra.

[range(10)] - [2, 4, 6]     # => [0, 1, 3, 5, 7, 8, 9]

Iterazione

jq fornisce molte funzioni che coprono le funzionalità di iterazione più comuni:

  • map(expr) restituisce un nuovo array in cui expr viene applicata a ogni elemento, uno alla volta.

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • select(expr) è una funzione che applica expr a un singolo valore; se il risultato dell'espressione è vero, il valore viene restituito; se il risultato è falso, non viene restituito nulla: non null, davvero nulla.

    Per applicarla a un array, combinala con map.

    [range(10)] | map(select(. % 2 == 0))    # => [0, 2, 4, 6, 8]
    

    In alternativa, applica select a uno stream e raccogli i risultati.

    [range(10) | select(. % 2 == 0)]    # => [0, 2, 4, 6, 8]
    
  • any(condition) e all(condition) restituiscono un valore booleano che indica se uno o tutti gli elementi dell'array soddisfano la condizione.

    [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
    

Appartenenza

Possiamo verificare che un array contenga un elemento con index. Questa funzione restituisce l'indice dell'elemento dato se è presente nell'array; altrimenti restituisce null.

["carrots", "beef", "potatoes"] | index("beef")    # => 1
["carrots", "beef", "potatoes"] | index("bees")    # => null

Esiste una funzione inversa chiamata IN (sì, tutta in maiuscolo). La particolarità di IN è che il suo argomento non è un array, ma uno stream.

"beef" | IN(["carrots", "beef", "potatoes"][])    # => true
"bees" | IN(["carrots", "beef", "potatoes"][])    # => false

Altre funzioni (fai riferimento al manuale per i dettagli)

  • Ruby ha un comodo metodo each_with_index che abbina il valore dell'elemento al suo indice. Python ha enumerate. jq ha qualcosa di simile, chiamato to_entries. Trasforma l'array in un array di oggetti {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 e sort_by

  • group_by

  • min, max, min_by, max_by

  • unique, unique_by

  • flatten

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Array

La pratica è bloccata

Sblocca 8 altri esercizi per esercitarti su Array