arrays - 如何像数组一样处理递归下降的结果?
问题描述
我想过滤某个键的所有值,然后对它们的数组应用进一步的计算,例如对它们求和。
{
"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?'
,如何将其视为数组?
解决方案
add
需要一个数组,因此您可以将流包装起来 ( [..|.v?]
),或者更好的是,定义一个基于流的版本add
:
def sigma(s): reduce s as $x (0; .+$x);
sigma(.. | .v?)
(由于[]|add
yield null
,您可能希望在上面的定义中替换0
为 by null
。)
推荐阅读
- matlab - 对 GPX 文件进行编码,使其被 Here API 的 /matchroute 端点接受
- c# - ASP.NET Core 2.1 不显眼的 Ajax 验证不适用于部分视图表单交换
- javascript - 错误 RangeError:最大调用堆栈大小超过 Angular 6 - JavaScript
- javascript - Nodejs 进行自动 csrf 保护
- autohotkey - 具有击键组合的 Autohotkey 脚本
- java - 使用原始数组在 Java 中创建排行榜
- gnu-parallel - GNU 并行:从作业日志中删除行会中断并行更新
- vue.js - 点击事件的“toHaveBeenCalled”仅在两次点击后才有效?(测试一个 Vue 应用程序)
- ruby-on-rails - 行更改日志文件中的位置
- javascript - 渲染错误:TypeError:文件未定义