【问题标题】:How to process the results of a recursive descent like an array?如何像数组一样处理递归下降的结果?
【发布时间】:2021-02-12 18:56:25
【问题描述】:

我想过滤某个键的所有值,然后对它们的数组应用进一步的计算,例如总结一下。

{
    "v": 0,
    "child": {
        "v": 2,
        "child": {
            "v": 3,
            "child": {
                "v": null
            }
        },
    "list": [{"v":4}]
    }
}

直觉上我尝试jq '..|.v? | add' 并期待9 但得到一个错误:

jq: error (at <stdin>:12): Cannot iterate over number (0)
exit status 5

所以我猜它会将第一个元素视为一个数组,而不是将所有过滤后的值视为一个数组。

使用jq '..|.v?' 我可以将它们打印出来:

0
2
3
null
null
4

但它们似乎不是一个数组(因为 'echo "[0,2,3,null,null,4]" | jq 'add'' 有效)。

那么jq '..|.v?' 的结果的“类型”是什么,如何将其视为数组?

【问题讨论】:

  • @oguzismail 我猜对我来说不是很明显,谢谢!

标签: arrays jq


【解决方案1】:

add 需要一个数组,因此您可以将您的流包装起来 ([..|.v?]),或者更好的是,定义一个基于流的 add 版本:

def sigma(s): reduce s as $x (0; .+$x);

sigma(.. | .v?)

(由于[]|add 产生null,您可能希望在上述定义中将0 替换为null。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2014-10-25
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多