JSON 把陣列定義為:
陣列是有序的值的集合。 陣列以
[左方括號開始,以]右方括號結束。 值與值之間以,逗號分隔。
陣列可以包含零個或多個_任何類型_的 JSON 值。 陣列元素不需要都是相同的型別。
用方括號把元素收集成陣列。
[1, 2, 3]
把_串流_用方括號包起來,就能把它的元素收集成陣列。
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
length函式會回傳陣列中元素的數量。
陣列的索引從 0 開始。
用方括號運算式從陣列取出元素:
.[2]取得第三個元素。
負的索引會從陣列尾端往回算:
.[-1]取得最後一個元素;.[-2]則是倒數第二個。
切片是陣列的子序列。
.[10:15]從索引 10 開始回傳 5 個元素;結束索引_不包含_在內。
還有幾個方便好用的函式:
first取得第一個元素。last取得最後一個元素。nth(n)取得索引n的元素。jq提供了許多函式,涵蓋常見的疊代功能:
map(expr)會回傳一個新陣列,其中expr會依序套用到每個元素上。
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
select(expr)是一個函式,會把expr套用到_單一值_上;
如果運算式的結果為 true,就回傳該值;
如果結果為 false,就_什麼都不_回傳,不是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 格式儲存鳥的數量。 一個「main」陣列會儲存每週數量的陣列。 每週的數量是一個由七個整數組成的陣列,每個數字對應一週中的一天。 你總是將新的週資料附加到 main 陣列的末端。 實作這個篩選器,讓它回傳上週的數量。
$ 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
}