學習軌道
/
jq
jq
/
練習
/
鳥類計數
鳥類計數

鳥類計數

學習練習

簡介

陣列

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
    

說明

你是個熱愛賞鳥的人,會記錄過去七天有多少鳥飛進你的花園。

你有五個任務,全都和造訪你花園的鳥的數量有關。

1. 查看上週的數量

你以 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],
  ...

2. 查看昨天有多少鳥來訪

實作篩選器,回傳昨天有多少鳥造訪你的花園。 鳥的數量依日期排序,第一個元素是最早那天的數量,最後一個元素則是今天的數量。

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "yesterday": 4,
  ...

3. 計算來訪鳥隻的總數

實作篩選器,回傳這週造訪你花園的鳥的總數。

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "total": 44,
  ...

4. 計算忙碌的天數

有些日子比其他日子更忙。 所謂忙碌的一天,是指有五隻或更多鳥造訪你花園的一天。 實作篩選器,回傳這週忙碌的天數。

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "busy_days": 4,
  ...

5. 查看是否有沒有任何鳥來訪的一天

實作篩選器:如果這週有任何一天沒有鳥造訪花園,就回傳true;否則回傳false。

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "has_day_without_birds": false
}
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
jq Exercism

準備好開始 鳥類計數 了嗎?

註冊 Exercism,透過 12 個概念75 個練習 和真人引導來學習並精通 jq,全部免費。