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]는 세 번째 원소를 가져와요.
음수 인덱스는 배열의 끝에서부터 거꾸로 세요.
.[-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을 적용하는 함수예요.
표현식의 결과가 참이면 그 값을 반환하고, 거짓이면 아무것도 반환하지 않아요. 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일 동안 정원에 몇 마리의 새가 찾아왔는지 기록하는 열렬한 새 관찰자예요.
정원을 찾아온 새의 수를 다루는 다섯 가지 과제가 있어요.
새 개수는 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
}