数组

数组 属于 jq

5 个练习

关于 数组

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

通过 GitHub 编辑 该链接会在新窗口或标签页中打开

学习 数组

练习已锁定

再解锁 8 个练习即可练习 数组