Arrays jq:index/1在元素为数组时不起作用

Arrays jq:index/1在元素为数组时不起作用,arrays,json,indexing,jq,Arrays,Json,Indexing,Jq,我希望它返回0。 相反,它返回null。 索引仅适用于带有标量的数组,但一旦存在嵌套数组,它将返回null。 为什么?因为显然索引需要查找元素的子序列,标量是一种特殊情况,相当于一个元素序列 比较三种情况: echo "[[{\"t\":4}]]" | jq 'index(.[0])' 他们都返回1 因此,在您的例子中,它试图在包含列表(而不是直接对象)的列表中找到由对象组成的单个元素子序列。在jq手册中,在标题index下有一个关于index语义的提示。简言之,看似有缺陷的行为实际上是一个“

我希望它返回0。 相反,它返回null。 索引仅适用于带有标量的数组,但一旦存在嵌套数组,它将返回null。
为什么?

因为显然
索引
需要查找元素的子序列,标量是一种特殊情况,相当于一个元素序列

比较三种情况:

echo "[[{\"t\":4}]]" | jq 'index(.[0])'
他们都返回1


因此,在您的例子中,它试图在包含列表(而不是直接对象)的列表中找到由对象组成的单个元素子序列。

在jq手册中,在标题
index
下有一个关于
index
语义的提示。简言之,看似有缺陷的行为实际上是一个“特征”。也就是说,以下说明了预期的行为:

echo "[0,2,0,3,0,6,0,2]" | jq 'index(2)'
echo "[0,2,0,3,0,6,0,2]" | jq 'index([2])'
echo "[0,2,0,3,0,6,0,2]" | jq 'index([2,0])'
因此,使用
索引([X])
搜索JSON实体X总是安全的。不幸的是,由于
索引
目前的实现方式,它并没有(应该)那么有效,但这是一个不同的主题

但是,关于
[[X]]
和/1中的
是值得了解的

[X]] 一个鲜为人知的事实是,后缀方括号提供了“索引”功能:

$ jq 'index([1,2])'
[1,2]
0
$ jq 'index([[1,2]])'
[[1,2]]
0
$ 
因此,要恢复输入数组中X的最小索引:

$ jq -nc '[1,2,30,3,3][[3]]'
[3,4]

$ jq -nc '[[1],2,30,3][[1]]'
[]

$ jq -nc '[[1],2,30,3][[[1]]]'
[0]

$ jq -nc '[{a:1},2,30,3][[ {a:1} ]]'
[0]
.[[X]][0]
索引/1
一样,如果X不在输入数组中,则返回null:

$ jq -nc '[1,2,30,3,3][[3]]'
[3,4]

$ jq -nc '[[1],2,30,3][[1]]'
[]

$ jq -nc '[[1],2,30,3][[[1]]]'
[0]

$ jq -nc '[{a:1},2,30,3][[ {a:1} ]]'
[0]
.[[X]][0]
IN/1 jq的“主”版本有一对直接面向流的过滤器(在
中命名为
),用于检查项目是否在流中。以下是/1
的有效定义,如果您的jq有
第一个/1
,则可以使用该定义:

$ jq -n '[1,2,3][ [4] ][0]'
null
这里
s
是要搜索的流