微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jq +运算符渴望吗?

如何解决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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。