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.
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]
Die Funktion length gibt die Anzahl der Elemente in einem Array zurück.
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.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
# ........................^^
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]
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
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
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