如何使用jq无需中间变量获取数组匹配元素的前一项?
用jq单命令获取数组中指定元素的前一个元素
假设你的JSON数据结构如下(示例):
{ "versions": ["1.0.0", "1.1.0", "1.2.0", "2.0.0", "2.1.0"] }
基础实现(无边界处理)
直接用一行jq命令就能完成,不需要中间变量:
jq --arg VERSION "2.0.0" '.versions | .[index($VERSION) - 1]' your-input.json
执行后会返回"1.2.0",也就是指定版本的前一个元素。
带边界处理的版本
如果需要处理指定版本不存在或者是数组第一个元素的情况(避免索引越界返回无意义结果),可以加个判断逻辑:
jq --arg VERSION "1.0.0" ' .versions | (index($VERSION) // 0) as $idx | if $idx > 0 then .[$idx - 1] else null end ' your-input.json
这个版本中:
- 如果指定版本不存在,
index($VERSION)返回null,// 0会把索引设为0,最终返回null - 如果指定版本是第一个元素,同样返回
null - 正常情况返回前一个元素
关键逻辑说明
--arg VERSION "xxx":把外部传入的版本号作为jq内部变量$VERSION使用index($VERSION):查找指定元素在数组中的索引位置.[$idx - 1]:通过索引减1获取前一个元素
内容的提问来源于stack exchange,提问作者Oscar
相关产品推荐
相关产品推荐

