query-json 进阶语法实战手册:变量、fn函数、reduce 与模式解构 8 大技巧
query-json 进阶语法实战手册变量、fn函数、reduce 与模式解构 8 大技巧【免费下载链接】query-jsonFaster, simpler and more portable implementation of jq-inspired language in OCaml项目地址: https://gitcode.com/gh_mirrors/qu/query-jsonquery-json 是一个比 jq 更快、语法更简洁的 JSON 查询语言OCaml 原生实现。本文带你掌握它的进阶语法实战技巧变量绑定、fn自定义函数、reduce累加、模式解构等 8 大核心能力帮你写出简洁又强大的 JSON 处理脚本 技巧一用as $var绑定变量当同一段数据要重复使用时用变量绑定一次后面处处引用query-json (.bar as $x | .foo | . $x) {foo:10,bar:200} # 输出: 210长尾场景速查保存中间结果(.users | length) as $count | ...变量可以重新绑定内层遮蔽外层(. as $i | ... (. as $i | $i) ...)支持环境变量$ENV.HOME 与 jq 完全兼容的语法迁移零成本。技巧二用fn定义自定义函数query-json 用fn替代 jq 的def——定义的是function而不是definition语义更清晰query-json fn double: . * 2; [1,2,3] | map(double) # 输出: [2, 4, 6]带参数的函数可以嵌套、递归实现力极强# 递归阶乘 query-json fn fact: if . 1 then 1 else . * ((. - 1) | fact) end; 5 | fact # 递归斐波那契 query-json fn fib: if . 1 then . else ((. - 1) | fib) ((. - 2) | fib) end; 10 | fib # 输出: 55更完整的fn实战含嵌套作用域、递归分块可参考测试用例 Test_runtime.ml语法定义见 Ast.ml。技巧三reduce累加器——把数组折叠成结果reduce是处理求和、拼接、聚合的终极武器query-json reduce .[] as $x (0; . $x) [1,2,3,4,5] # 输出: 15三种高频用法# 1. 数值求和reduce EXPR as $x (初始值; 更新表达式) query-json reduce .[] as $item (0; . $item.value) [{value:10},{value:20}] # 输出: 30 # 2. 对象合并初始 {} 用 * 合并 query-json reduce .[] as $obj ({}; . * $obj) [{a:1},{b:2}] # 输出: {a:1,b:2} # 3. 运行中累计值 query-json fn running_total: reduce .[] as $x ([]; . [last? as $l | $l $x]); [1,2,3] | running_total技巧四foreach—— 带状态遍历与增量输出foreach比reduce多一个提取阶段可以边计算边输出每一步的中间状态# 累计和序列每步都输出 query-json [foreach .[] as $x (0; . $x; .)] [1,2,3] # 输出: [1, 3, 6] # 自定义提取同时保留当前项 query-json [foreach .[] as $item (0; . $item; [$item, . * 2])] [1,2,3,4,5]技巧五模式解构——一次as拆出整个结构 这是 query-json 超越 jq 的杀手级特性绑定变量时可以直接解构数组和对象无需层层取字段# 解构数组 嵌套对象一步取齐 query-json . as [$a, $b, {c: $c}] | $a $b $c [2, 3, {c: 4, d: 5}] # 输出: 9 # 遍历时逐项解构 query-json .[] as [$a, $b] | {a: $a, b: $b} [[0], [0,1], [2,1,0]]配合reduce威力翻倍——直接解构二维数组query-json reduce .[] as [$i, $j] (0; . $i * $j) [[1,2],[3,4],[5,6]] # 输出: 50技巧六select/filter链式过滤过滤数组元素用select条件判断或 query-json 更简洁的filterquery-json .second.store.books | map(.price) | add test/mock.json query-json fn expensive: .price 20; .second.store.books | filter(expensive) test/mock.json query-json .items | map(select(.price 100)) products.json上面正是项目演示脚本 cli-advanced.sh 中的真实用法fn与filter组合让自定义条件过滤一行搞定。技巧七group_by/keys/unique的新行为 ⚠️从 jq 迁移过来这三个函数行为有关键差异务必注意函数jq 行为query-json 行为group_by返回数组的数组直接返回对象按键取组更直观keys排序后返回保持插入顺序需要排序请keys \| sortunique去重后排序保持插入顺序保留首次出现query-json group_by(.category) items.json # {books:[...], electronics:[...]} ← 直接就是对象 query-json group_by(.category) | map_values(length) items.json # 一行统计各类目数量技巧八错误处理——?可选访问 try-catchquery-json 对 null更严格默认报错而不是静默传播帮你更早发现 bug# 想容错加 ? 即可返回 null 而不是报错 query-json .missing? {name: Alice} # null query-json .a.b? {a: null} # null # 复杂场景用 try-catch语法同 jq query-json try .foo.bar catch not found每个错误信息都带位置、上下文和修复建议hint详见兼容性指南 JQ_COMPATIBILITY.md。 进阶速查清单语法用途示例expr as $x变量绑定(.bar as $x \| .foo $x)expr as [$a, $b]数组解构.[] as [$i, $j]expr as {k: $v}对象解构. as [{a: $a}]fn name: body无参自定义函数fn double: . * 2;fn name(p): body带参函数fn add(p): . p;reduce as $x (init; upd)折叠累加求和/合并/聚合foreach ... (init; upd; ext)增量输出累计和序列expr?可选访问.first?、to_number?学习资源完整语法与函数对照表JQ_COMPATIBILITY.md可运行的演示脚本docs/demo-scripts/如 cli-advanced.sh全部运行时行为测试Test_runtime.ml全部对比演示动画all-demos.gif一句话总结变量解耦重复、fn封装逻辑、reduce/foreach处理状态、模式解构告别繁琐取值——掌握这 8 大技巧你的 query-json 查询就能从能用进化到优雅 【免费下载链接】query-jsonFaster, simpler and more portable implementation of jq-inspired language in OCaml项目地址: https://gitcode.com/gh_mirrors/qu/query-json创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考