如何解决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
}
我将命令改写为
.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 举报,一经查实,本站将立刻删除。