JSON یک آرایه را اینگونه تعریف میکند:
آرایه مجموعهای مرتب از مقادیر است. آرایه با
[(براکت چپ) شروع میشود و با](براکت راست) پایان مییابد. مقادیر با,(کاما) از هم جدا میشوند.
آرایهها میتوانند صفر یا چند مقدار از هر نوعی از مقادیر JSON را در خود داشته باشند. نیازی نیست عناصر آرایه همه از یک نوع باشند.
برای گردآوردن عناصر در یک آرایه از براکت استفاده کنید.
[1, 2, 3]
عناصر یک جریان را میتوان با گذاشتن آن میان براکت در یک آرایه جمع کرد.
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
تابع length تعداد عناصر یک آرایه را برمیگرداند.
اندیسگذاری آرایهها از صفر شروع میشود.
یک عنصر را با یک عبارت براکتی از آرایه بهدست آورید:
.[2] عنصر سوم را میگیرد.
اندیسهای منفی از انتهای آرایه به عقب شمرده میشوند:
.[-1] آخرین عنصر را میگیرد و .[-2] دومین عنصر از انتها است.
یک برش زیردنبالهای از آرایه است.
.[10:15] پنج عنصر را از اندیس ۱۰ به بعد برمیگرداند؛ اندیس پایان لحاظ نمیشود.
چند تابع کمکی هم وجود دارد:
first اولین عنصر را میگیرد.last آخرین عنصر را میگیرد.nth(n) عنصر موجود در اندیس n را میگیرد.jq توابع زیادی برای پوشش کارکردهای رایج پیمایش فراهم میکند:
map(expr) یک آرایهی جدید برمیگرداند که در آن expr به نوبت روی هر عنصر اعمال میشود.
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
select(expr) تابعی است که expr را روی یک مقدار تکی اعمال میکند؛
اگر نتیجهی عبارت «درست» باشد، آن مقدار برگردانده میشود؛
اگر نتیجه «غلط» باشد، هیچچیز برگردانده نمیشود، نه null، بلکه واقعاً هیچ.
برای اعمال آن روی یک آرایه، آن را با map ترکیب کنید.
[range(10)] | map(select(. % 2 == 0)) # => [0, 2, 4, 6, 8]
بهطور جایگزین، select را روی یک جریان اعمال کنید و نتایج را جمع کنید.
[range(10) | select(. % 2 == 0)] # => [0, 2, 4, 6, 8]
any(condition) و all(condition) یک مقدار منطقی برمیگردانند که آیا هیچکدام یا همهی عناصر آرایه شرط را برآورده میکنند یا نه.
[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
شما یک پرندهنگر مشتاق هستید و پیگیری میکنید که در هفت روز گذشته چند پرنده از باغتان بازدید کردهاند.
شما پنج کار دارید که همهشان به تعداد پرندههایی مربوط میشوند که از باغتان بازدید کردهاند.
شمارشهای پرندههایتان را در قالب JSON ذخیره میکنید. یک آرایهی «اصلی» آرایههایی از شمارشهای هفتگی را در خود جای میدهد. هر شمارش هفتگی آرایهای از هفت عدد صحیح است؛ یک عدد برای هر روز هفته. شما همیشه هفتههای جدید را به انتهای آرایهی اصلی اضافه میکنید. یک «فیلتر» پیادهسازی کنید که شمارشهای هفتهی گذشته را برمیگرداند.
$ 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],
...
فیلتر را طوری پیادهسازی کنید که تعداد پرندههایی را که دیروز از باغتان بازدید کردهاند برگرداند. شمارشهای پرندهها بر اساس روز مرتب شدهاند؛ اولین عنصر شمارش قدیمیترین روز است و آخرین عنصر شمارش امروز.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"yesterday": 4,
...
فیلتر را طوری پیادهسازی کنید که تعداد کل پرندههایی را که این هفته از باغتان بازدید کردهاند برگرداند.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"total": 44,
...
بعضی روزها شلوغتر از بقیه هستند. روز شلوغ روزی است که پنج پرنده یا بیشتر از باغتان بازدید کرده باشند. فیلتر را طوری پیادهسازی کنید که تعداد روزهای شلوغ این هفته را برگرداند.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"busy_days": 4,
...
فیلتر را طوری پیادهسازی کنید که اگر این هفته روزی بوده باشد که هیچ پرندهای از باغ بازدید نکرده است، true را برگرداند؛ در غیر این صورت، false را برگرداند.
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"has_day_without_birds": false
}