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] повертає 5 елементів, починаючи з індексу 10; кінцевий індекс не включається.
Є кілька зручних функцій:
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) повертають булеве значення (англ. Boolean) залежно від того, чи проходять умову будь-які або всі елементи масиву.
[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
}
Зареєструйтеся на Exercism, щоб вивчати й опановувати jq, а також 12 концепцій75 вправ та справжнє наставництво від людей, і все це безкоштовно.