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
}
zoneTag
是 zones
对象中的最后一个属性。
我将命令重写为
.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.
我最初把我的 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
}
zoneTag
是 zones
对象中的最后一个属性。
我将命令重写为
.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.