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的元素。有时我们希望逐个流式处理数组的元素。
为此,我们使用.[]。
假设我们想要一个由数组中各字符串长度组成的流。
["a", "be", "cat", "door"] | length # => 4 -- the number of elements in the array
["a", "be", "cat", "door"] | .[] | length # => 1, 2, 3, 4 -- the lengths of each element
空方括号可以紧挨在前一个表达式后面,省略管道符。
["a", "be", "cat", "door"][] | length # => 1, 2, 3, 4 -- the lengths of each element
# ........................^^
使用+拼接数组。
[1, 2, 3] + [4, 5] # => [1, 2, 3, 4, 5]
-运算符从左边数组中移除右边数组中的元素。
[range(10)] - [2, 4, 6] # => [0, 1, 3, 5, 7, 8, 9]
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
我们可以使用index检测数组是否包含某个元素。
如果给定元素在数组中,该函数返回它的下标;否则函数返回null。
["carrots", "beef", "potatoes"] | index("beef") # => 1
["carrots", "beef", "potatoes"] | index("bees") # => null
有一个名为IN的反向函数(是的,大写字母)。
IN的特别之处在于,它的参数不是数组,而是_流_。
"beef" | IN(["carrots", "beef", "potatoes"][]) # => true
"bees" | IN(["carrots", "beef", "potatoes"][]) # => false
Ruby 有一个方便的each_with_index方法,它将元素值与其下标配对。
Python 有enumerate。
jq有类似的东西,名为to_entries。
它会将数组转换为由{key: index, value: value}对象组成的数组。
[11, 22, 33, 44] | to_entries
# => [{key: 0, value: 11}, {key: 1, value: 22}, {key: 2, value: 33}, {key: 3, value: 44}]
sort和sort_by
group_by
min、max、min_by、max_by
unique、unique_by
flatten