jq +运算符渴望吗?

问题描述

我最初将我的jq命令写为

.data.viewer.zones[] | .httpRequests1mGroups[0].sum|with_entries(select(.key|endswith("Map")|not))  + {"zoneTag": .zoneTag} 

并得到以下结果:

{
  "bytes": 2875120330,"cachedBytes": 1475518778,"zoneTag": null
}
{
  "bytes": 2875120330,"zoneTag": null
}

zoneTagzones对象中的最后一个属性。

我将命令改写为

.data.viewer.zones[] |  {"zoneTag": .zoneTag} +   .httpRequests1mGroups[0].sum|with_entries(select(.key|endswith("Map")|not))  

并达到我的期望:

{
  "zoneTag": "zone 1","bytes": 2875120330,}
{
  "zoneTag": "zone 2",}

我的问题是为什么? +渴望吗? (我使用*得到了相同的结果。)

谢谢。

解决方法

在jq中,对于大多数目的,包括对象添加的目的,右侧对象中的显式null值与缺少键是不同的。

因此,如果A为{"a": 1},则A + {}为A,而A + {"a": null}为{“ a”:null}。

因此,“最右边的值”规则必须理解为“最右边的显式值”。

这是否与“渴望”有关取决于您对该术语的理解。

非懒惰评估

在jq中,对象添加(实际上实际上是一般的添加)是从右向左进行的,并且当然是非惰性的,如以下示例所示,该示例还说明了上述RHS优势。

jq -n '{a:(1|debug)} + {b: (2|debug)} + {a:(3|debug)}'
["DEBUG:",3]
["DEBUG:",2]
["DEBUG:",1]
{
  "a": 3,"b": 2
}

据我所知,可能无法保证右关联性。

,

所以也许您正在寻找关于运算符优先级的解释。

让:

A代表.data.viewer.zones[]

B代表.httpRequests1mGroups[0].sum

C代表with_entries(select(.key|endswith("Map")|not))

然后您的第一个jq表达式等效于

A | B | C + {zoneTag}

而您的秒数等于:

A  | {zoneTag} + B | C

因此,在第一种情况下,{zoneTag}从B获得值,但在 第二种情况,它来自A。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...