JSON definiert ein Array wie folgt:
Ein Array ist eine geordnete Sammlung von Werten. Ein Array beginnt mit der linken eckigen Klammer
[und endet mit der rechten eckigen Klammer]. Die Werte werden durch ein Komma,getrennt.
Arrays können null oder mehr JSON-Werte jeder Art 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 kannst du in einem Array sammeln, indem du ihn in eckige Klammern setzt.
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.
Ein Element holst du mit einem Klammerausdruck aus einem Array:
.[2] liefert das dritte Element.
Negative Indizes zählen vom Ende des Arrays rückwärts:
.[-1] liefert das letzte Element; .[-2] das vorletzte.
Ein Slice ist eine Teilsequenz des Arrays.
.[10:15] gibt 5 Elemente ab Index 10 zurück; der Endindex ist nicht enthalten.
Es gibt ein paar praktische Funktionen:
first liefert das erste Element.last liefert das letzte Element.nth(n) liefert das Element an Index n.jq bietet viele Funktionen, die die üblichen Iterationsaufgaben abdecken:
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;
ist das Ergebnis des Ausdrucks wahr, wird der Wert zurückgegeben;
ist das Ergebnis falsch, wird nichts zurückgegeben, nicht null, sondern wirklich nichts.
Um das auf ein Array anzuwenden, kombinierst du 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 beliebige oder 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
Du bist ein begeisterter Vogelbeobachter und hältst fest, wie viele Vögel in den letzten sieben Tagen deinen Garten besucht haben.
Du hast fünf Aufgaben, die sich alle mit der Anzahl der Vögel befassen, die deinen Garten besucht haben.
Du speicherst deine Vogelzählungen im JSON-Format. Ein „Haupt“-Array speichert Arrays mit den wöchentlichen Zählungen. Jede wöchentliche Zählung ist ein Array aus sieben Ganzzahlen, eine Zahl für jeden Tag der Woche. Neue Wochen hängst du immer am Ende des Haupt-Arrays an. Implementiere den Filter, der die Zählungen der letzten Woche zurückgibt.
$ cat bird-counting-data.json
[
...,
[0, 2, 5, 3, 7, 8, 4],
[4, 5, 9, 10, 9, 4, 3]
]
$ jq -f bird-count.jq < bird-counting-data.json
{
"last_week": [0, 2, 5, 3, 7, 8, 4],
...
Implementiere den Filter, der zurückgibt, wie viele Vögel gestern deinen Garten besucht haben. Die Vogelzählungen sind nach Tagen geordnet: Das erste Element ist die Zählung des ältesten Tages, das letzte Element die Zählung von heute.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"yesterday": 4,
...
Implementiere den Filter, der die Gesamtzahl der Vögel zurückgibt, die diese Woche deinen Garten besucht haben.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"total": 44,
...
Manche Tage sind geschäftiger als andere. Ein geschäftiger Tag ist ein Tag, an dem fünf oder mehr Vögel deinen Garten besucht haben. Implementiere den Filter, der die Anzahl der geschäftigen Tage dieser Woche zurückgibt.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"busy_days": 4,
...
Implementiere den Filter, der true zurückgibt, wenn es diese Woche einen Tag gab, an dem null Vögel den Garten besucht haben; andernfalls gibt er false zurück.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"has_day_without_birds": false
}
Melde dich bei Exercism an, um jq mit 12 Konzepte75 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.