Ar

Arrays in jq

5 Übungen

Über Arrays

JSON definiert ein Array wie folgt:

Ein Array ist eine geordnete Sammlung von Werten. Ein Array beginnt mit einer [ linken eckigen Klammer und endet mit einer ] rechten eckigen Klammer. Werte werden durch ein , Komma getrennt.

Arrays können null oder mehr Werte jeglicher Art aus JSON enthalten. Die Elemente eines Arrays müssen nicht alle denselben Typ haben.

Arrays erstellen

Verwende eckige Klammern, um Elemente in einem Array zu sammeln.

[1, 2, 3]

Die Elemente eines Streams lassen sich in einem Array erfassen, indem du ihn in eckige Klammern einschließt.

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

Größe

Die Funktion length gibt die Anzahl der Elemente in einem Array zurück.

Indizierung und Slicing

Die Indizierung von Arrays beginnt bei null.

Du holst ein Element aus einem Array mit einem Klammerausdruck: .[2] liefert das dritte Element.

Negative Indizes zählen vom Ende des Arrays rückwärts: .[-1] liefert das letzte Element; .[-2] ist das vorletzte.

Ein Slice ist eine Teilfolge des Arrays. .[10:15] liefert 5 Elemente ab Index 10; der Endindex ist nicht enthalten.

Es gibt einige praktische Funktionen:

  • first liefert das erste Element.
  • last liefert das letzte Element.
  • nth(n) liefert das Element an Index n.

In einen Stream von Elementen umwandeln

Es gibt Situationen, in denen wir die Elemente eines Arrays einzeln als Stream ausgeben möchten. Dafür verwenden wir .[].

Angenommen, wir möchten einen Stream der Längen der Strings in einem 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

Die leeren Klammern können direkt neben den vorherigen Ausdruck gesetzt werden, wobei die Pipe weggelassen wird.

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

Verketten und Subtrahieren

Verwende +, um Arrays zu verketten.

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

Der Operator - entfernt die Elemente des rechten Arrays aus dem linken Array.

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

Iterieren

jq bietet viele Funktionen für gängige Iterationsaufgaben:

  • map(expr) gibt ein neues Array zurück, in dem expr nacheinander auf jedes Element angewendet wird.

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • select(expr) ist eine Funktion, die expr auf einen einzelnen Wert anwendet; wenn das Ergebnis des Ausdrucks wahr ist, wird der Wert zurückgegeben; wenn das Ergebnis falsch ist, wird nichts zurückgegeben, nicht null, sondern wirklich nichts.

    Um das auf ein Array anzuwenden, kombiniere es mit map.

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

    Alternativ wendest du select auf einen Stream an und sammelst die Ergebnisse.

    [range(10) | select(. % 2 == 0)]    # => [0, 2, 4, 6, 8]
    
  • any(condition) und all(condition) geben einen booleschen Wert zurück, je nachdem, ob einige/alle Elemente im Array die Bedingung erfüllen.

    [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
    

Enthaltensein

Wir können mit index prüfen, ob ein Array ein Element enthält. Diese Funktion gibt den Index des angegebenen Elements zurück, wenn es im Array enthalten ist; andernfalls gibt die Funktion null zurück.

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

Es gibt eine Umkehrfunktion namens IN (ja, in Großbuchstaben). Die Besonderheit bei IN ist, dass sein Argument kein Array ist, sondern ein Stream.

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

Weitere Funktionen (siehe Handbuch für Details)

  • Ruby hat eine praktische Methode each_with_index, die den Elementwert mit seinem Index paart. Python hat enumerate. jq hat etwas Ähnliches namens to_entries. Das wandelt das Array in ein Array von Objekten {key: index, value: value} um.

    [11, 22, 33, 44] | to_entries
    # => [{key: 0, value: 11}, {key: 1, value: 22}, {key: 2, value: 33}, {key: 3, value: 44}]
    
  • sort und sort_by

  • group_by

  • min, max, min_by, max_by

  • unique, unique_by

  • flatten

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Arrays

Das Üben ist gesperrt

Schalte 8 weitere Übungen frei, um Arrays zu üben