gpt4 book ai didi

jq - 更新运算符在 JQ 中产生空对象

转载 作者:行者123 更新时间:2023-12-02 16:10:34 30 4
gpt4 key购买 nike

我无法理解以下示例中显示的 jq(版本 1.6)更新运算符的行为。

为什么示例 1 返回更新后的对象,而示例 2 和 3 返回空对象或错误结果?

例子之间的区别仅在于将字符串转换为数字的函数的调用顺序。

#!/bin/bash
#
# strange behaviour jq

# example 1 - works as expected
jq -n '
def numberify($x): $x | tonumber? // 0;

"1" as $stringValue
| numberify($stringValue) as $intValue
# | { } # version 1: a.b does not exist yet
| { a: { b: 1 } } # version 2: a.b exists already
| .["a"] |= { b: (.b + $intValue) }
'
# result example 1, version 1 - expected
# {
# "a": {
# "b": 1
# }
# }

# result example 1, version 2 - expected
# {
# "a": {
# "b": 2
# }
# }


# example 2 - erroneous result
jq -n '
def numberify($x): $x | tonumber? // 0;

"1" as $stringValue
# | { } # version 1: a.b does not exist yet
| { a: { b: 1 } } # version 2: a.b exists already
| .["a"] |= { b: (.b + numberify($stringValue)) }
'
# result example 2, version 1 - unexpected
# {}

# result example 2, version 2 - unexpected
# {}


# example 3 - erroneous result
jq -n '
def numberify($x): $x | try tonumber catch 0;

"1" as $stringValue
# | { } # version 1: a.b does not exist yet
| { a: { b: 1 } } # version 2: a.b exists already
| .["a"] |= { b: (.b + numberify($stringValue)) }
'
# result example 3, version 1 - unexpected
# {
# "a": {
# "b": 0
# }
# }

# result example 3, version 2 - unexpected
# {
# "a": {
# "b": 1
# }
# }

@oguzismail 使用“+=”而不是“|=”是个好主意。我以前没想过。目前,我的错误解决方法代码如下所示:

  def numberify($x): $x | tonumber? // 0;

"1" as $sumReqSize
| "10" as $sumResSize
| { statistics: { count: 1, sumReqSize: 2, sumResSize: 20 } }
| [numberify($sumReqSize), numberify($sumResSize)] as $sizes # workaround for bug
| .statistics |= {
count: (.count + 1),
sumReqSize: (.sumReqSize + $sizes[0]),
sumResSize: (.sumResSize + $sizes[1])
}
'

按照您的建议,它将更加简洁并且不需要丑陋的解决方法:

  def numberify($x): $x | tonumber? // 0;

"1" as $sumReqSize
| "10" as $sumResSize
| { statistics: { count: 1, sumReqSize: 2, sumResSize: 20 } }
| .statistics.count += 1
| .statistics.sumReqSize += numberify($sumReqSize)
| .statistics.sumResSize += numberify($sumResSize)

最佳答案

这是 jq 1.6 中的错误。一种选择是使用早期版本的 jq(例如 jq 1.5)。

另一种方法是通过使用 = 来避免 |=,按照以下行:

.a = (.a | ...)

或者如果 RHS 实际上并不依赖于 LHS(如在您的原始示例中),只需将 |= 替换为 =

关于jq - 更新运算符在 JQ 中产生空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68160740/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com