A JSON a következőképpen definiálja a tömb fogalmát:
A tömb értékek rendezett gyűjteménye. A tömb
[bal szögletes zárójellel kezdődik és]jobb szögletes zárójellel végződik. Az értékeket,(vessző) választja el.
A tömbök nulla vagy több bármilyen típusú JSON-értéket tartalmazhatnak. A tömbben lévő elemek nem feltétlenül azonos típusúak.
A zárójelek segítségével elemeket gyűjthetsz egy tömbbe.
[1, 2, 3]
Egy stream elemeit úgy gyűjtheted tömbbe, hogy zárójelek közé zárod.
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
A length függvény egy tömb elemeinek számát adja vissza.
A tömbök indexelése nullától kezdődik.
Egy tömb eleméhez zárójeles kifejezéssel férhetsz hozzá:
a .[2] a harmadik elemet adja.
A negatív indexek a tömb végétől számolódnak visszafelé:
a .[-1] az utolsó elemet adja, a .[-2] pedig az utolsó előttit.
A szelet a tömb egy részsorozata.
A .[10:15] 5 elemet ad vissza a 10-es indextől kezdve, a záró index nem számít bele.
Van néhány kényelmi függvény is:
first az első elemet adja.last az utolsó elemet adja.nth(n) az n indexű elemet adja.A jq számos függvényt kínál a gyakori iterációs műveletekhez:
A map(expr) egy új tömböt ad vissza, amelyben az expr minden elemre egymás után alkalmazva van.
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
A select(expr) egy olyan függvény, amely az expr-t egy egyetlen értékre alkalmazza;
ha a kifejezés eredménye igaz, akkor a függvény visszaadja az értéket;
ha az eredmény hamis, akkor semmi nem adódik vissza, nem null, hanem tényleg semmi.
Ha egy tömbre szeretnéd alkalmazni, kombináld a map-pal.
[range(10)] | map(select(. % 2 == 0)) # => [0, 2, 4, 6, 8]
Másik lehetőségként alkalmazd a select-et egy streamre, és gyűjtsd össze az eredményeket.
[range(10) | select(. % 2 == 0)] # => [0, 2, 4, 6, 8]
Az any(condition) és az all(condition) logikai értéket ad vissza arról, hogy a tömbben lévő elemek közül bármelyik/mindegyik teljesíti-e a feltételt.
[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
Szenvedélyes madárfigyelő vagy, aki nyomon követi, hány madár járt a kertedben az elmúlt hét napban.
Öt részfeladatod van, és mindegyik a kertedbe látogató madarak számával foglalkozik.
A madárszámokat JSON formátumban tárolod. Egy „fő” tömb heti számokat tartalmazó tömböket tárol. Minden heti szám egy hét egész számból álló tömb, a hét minden napjához egy szám. Az új heteket mindig a „fő” tömb végéhez fűzöd hozzá. Valósítsd meg azt a szűrőt, amely visszaadja a múlt heti számokat.
$ 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],
...
Valósítsd meg a szűrőt, amely visszaadja, hány madár járt a kertedben tegnap. A madárszámok nap szerint vannak rendezve: az első elem a legrégebbi nap száma, az utolsó pedig a mai napé.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"yesterday": 4,
...
Valósítsd meg a szűrőt, amely visszaadja, összesen hány madár járt a kertedben ezen a héten.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"total": 44,
...
Van, amelyik nap forgalmasabb a többinél. Forgalmas nap az, amikor öt vagy több madár járt a kertedben. Valósítsd meg a szűrőt, amely visszaadja az e heti forgalmas napok számát.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"busy_days": 4,
...
Valósítsd meg azt a szűrőt, amely true-t ad vissza, ha ezen a héten volt olyan nap, amikor nulla madár járt a kertedben; egyébként pedig false-t ad vissza.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"has_day_without_birds": false
}
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) jq nyelvet 12 fogalom75 feladat segítségével, valódi emberi mentorálással, mindez ingyen.