jq + 运算符是否急于求成?

Is the jq + operator eager?

我最初把我的 jq 命令写成

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

得到这个结果:

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

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

我将命令重写为

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

得到我期望的结果:

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

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

谢谢。

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

因此,如果 A 是 {"a": 1},则 A + {} 是 A,但 A + {"a": null} 是 {"a": null}。

因此,“right-most 值”规则必须理解为“right-most 显式值”。

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

Non-lazy评价

在 jq 中,对象加法(实际上通常是加法)从右到左进行,当然是 non-lazy,如下例所示,这也说明了 RHS-dominance上面提到了

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

据我所知,right-associativity 可能无法保证。

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

设:

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.