为何JSONata中数组索引用表达式与字面量结果不同?
正常可用的写法
假设我们有如下数据:
[[1,2], [3,4]]
要提取数字3,可以使用双层筛选。文档说明:
如果谓词表达式是整数,或求值为整数的表达式,则输入序列中对应位置(从零开始)的项将是结果序列中唯一被选中的项。
或者:
当需要有序值集合时会使用JSON数组。数组中的每个值都与索引(位置)关联而非名称,因此要寻址数组中的单个值,需要额外语法指定索引。这通过数组字段名后的方括号实现。如果方括号内包含数字,或求值为数字的表达式,则该数字代表要选择的值的索引。索引从零开始,即数组arr的第一个值为arr[0]。如果数字不是整数,则向下取整为整数。如果方括号内的表达式是非数值的,或求值结果非数字,则将其视为谓词。
这两段描述看似矛盾——第一段提到“[它]是结果序列中唯一被选中的项”,第二段则说“要选择的值”。不过两段都明确:字面整数与求值为整数的表达式效果相同。
因此,以下写法:
$[1][0]
会得到预期结果:3。
问题
文档指出谓词也可以是求值为整数的表达式。我认为1+0就是这样的表达式,于是尝试:
$[1+0][0]
结果却变成了:
[3,4]
我可以通过$[1+0][0][0]“修复”这个问题。这是怎么回事?
已尝试的操作
会不会是1+0并非求值为整数的表达式?如果是这样,按照文档说明它会被当作谓词处理,此时可能返回一个序列(恰好只有一个值)。但这种情况下,什么样的表达式才是求值为整数的表达式?
使用变量时也会得到相同结果:
( $index := 1 $[$index][0] )
内容的提问来源于stack exchange,提问作者yankee
相关产品推荐
相关产品推荐

