首页 > 解决方案 > 如何像数组一样处理递归下降的结果?

问题描述

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

{
    "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?',如何将其视为数组?

标签: arraysjq

解决方案


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

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

sigma(.. | .v?)

(由于[]|addyield null,您可能希望在上面的定义中替换0为 by null。)


推荐阅读