如何处理递归下降的结果像一个数组?



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

{
"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' ' works).

那么什么是"类型"jq '..|.v?'的结果,我怎么能把它作为一个数组?

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

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

(由于[]|add产生null,您可能希望用null替换上述def中的0)

最新更新