JSONは配列を次のように定義しています。
配列は、順序付けられた値の集まりです。 配列は左角括弧(
[)で始まり、右角括弧(])で終わります。 値はコンマ(,)で区切られます。
配列には、_あらゆる種類_のJSON値を0個以上入れることができます。 配列の要素がすべて同じ型である必要はありません。
要素を配列にまとめるには、角括弧を使います。
[1, 2, 3]
_ストリーム_の要素は、角括弧で囲むことで配列にまとめることができます。
range(5) # => a stream of 5 numbers
[range(5)] # => the array [0, 1, 2, 3, 4]
length関数は、配列の要素数を返します。
配列のインデックスは0から始まります。
角括弧を使った式で、配列から要素を取り出せます。
.[2]は3番目の要素を取得します。
負のインデックスは、配列の末尾から逆向きに数えます。
.[-1]は最後の要素を取得し、.[-2]は後ろから2番目の要素です。
スライスは、配列の部分列です。
.[10:15]は、インデックス10から始まる5つの要素を返します。終了のインデックスは_含まれません_。
便利な関数もいくつかあります。
firstは最初の要素を取得します。lastは最後の要素を取得します。nth(n)はインデックスnの要素を取得します。jqには、よくある繰り返しの機能をカバーする関数がたくさん用意されています。
map(expr)は、exprを各要素に順番に適用した新しい配列を返します。
[1, 2, 3] | map(. * 10) # => [10, 20, 30]
select(expr)は、_1つの値_に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
あなたは、過去7日間に庭に何羽の鳥が訪れたかを記録している、熱心なバードウォッチャーです。
庭に訪れた鳥の数を扱う、5つのタスクに取り組みます。
鳥の記録はJSON形式で保存します。 「main」配列には、週ごとの記録の配列が入ります。 各週の記録は7つの整数からなる配列で、1日につき1つの数値が入ります。 新しい週は、いつも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,
...
日によっては、ほかの日より忙しいこともあります。 忙しい日とは、庭に5羽以上の鳥が訪れた日のことです。 今週の忙しい日の数を返すフィルターを実装しましょう。
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"busy_days": 4,
...
今週、庭に鳥が1羽も訪れなかった日があればtrueを、そうでなければfalseを返すフィルターを実装しましょう。
$ jq -f bird-count.jq < bird-counting-data.json
{
...
"has_day_without_birds": false
}