You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jq数组嵌套下标语法问询:.[[x]]与常规下标语法的差异及原理解析

拆解jq中.[x]、.[[x]]、.[x,y]与.[[x,y]]的差异

我来帮你把这个容易混淆的jq语法逻辑拆解清楚!核心在于:jq的数组索引.[...]的行为完全取决于括号内表达式的类型,而.[[x]]本质是indices函数的语法糖,官方文档其实藏在indices的定义里。

1. 基础索引:.[x]和.[x,y]的直观用法

当括号里是单个数值或者多个用逗号分隔的数值时,这就是最常规的数组索引:

  • .[x]:直接提取数组中索引为x的元素(负数索引会从数组末尾倒数)
  • .[x,y]:提取索引x和y对应的元素,结果是流式输出(也就是多个值依次打印,不是数组)

比如你测试的这个例子:

echo '[1,2,3,4,3,2,1]' | jq '.[2,3]' # 输出:3 4

就是直接拿索引2的3和索引3的4,两个值分别输出。

2. 特殊索引:.[[x]]和.[[x,y]]的本质是indices函数

当括号里是一个数组的时候,jq会自动触发indices/1函数的逻辑——这就是你看到的“查找值的索引”的核心!

官方文档里indices函数的定义就是def indices($i): .[[$i]];,换句话说,.[[$i]]就是indices($i)的等价写法,只是用了更简洁的索引语法。

拆解.[[1]]的运行逻辑

echo '[1,2,3,4,3,2,1]' | jq '.[[1]]' # 输出:[0,6]

这完全等价于调用indices(1):遍历整个数组,找出所有值等于1的元素的索引,最后把这些索引打包成数组返回,也就是[0,6]。

拆解.[[2,3]]的运行逻辑

echo '[1,2,3,4,3,2,1]' | jq '.[[2,3]]' # 输出:[1]

这里括号里的参数是数组[2,3],所以等价于indices([2,3])——它会查找原数组中**连续子数组完全匹配[2,3]**的起始位置。原数组里从索引1开始的元素是2和3,正好匹配,所以返回起始索引[1]。

3. 核心关联总结

为了更清晰,我把四种语法的等价关系和行为整理成了表格:

语法等价写法行为说明
.[x]直接索引提取单个索引x对应的元素(x为数值)
.[x,y]多索引直接提取提取索引x和y的元素,流式输出多个值
.[[x]]indices(x)查找数组中值等于x的所有元素的索引,返回索引数组
.[[x,y]]indices([x,y])查找数组中连续子数组等于[x,y]的所有起始索引,返回索引数组

关于官方文档的补充

这种.[[x]]的语法确实没有单独作为一个独立条目在索引部分说明,但它是indices函数的语法糖,官方在indices的内置函数文档里明确给出了def indices($i): .[[$i]];的定义——相当于告诉你,.[[$i]]就是indices($i)的另一种写法,反过来也成立。

内容的提问来源于stack exchange,提问作者knittl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:27:38