jq遍历JSON数组时如何获取上一迭代值实现igroup格式区分
解决方案
核心思路是使用jq的reduce函数遍历行数组,通过状态变量记录是否已经遇到当前连续igroup=true序列的第一个元素,避免单独判断当前值导致的逻辑错误。
修正后代码
.result[] | .segments[0].lines | reduce .[] as $line ( {seen_first_true: false, output: []}; if $line.igroup == false then # igroup为false统一标记MARK,重置连续true的标记 .seen_first_true = false | .output += [ [ "line format", "MARK", ([ $line.products[].name ] | join(",")), "end line format" ] | join("|") ] else if .seen_first_true == false then # 第一个igroup=true标记MARK,更新状态 .seen_first_true = true | .output += [ [ "line format", "MARK", ([ $line.products[].name ] | join(",")), "end line format" ] | join("|") ] else # 后续igroup=true标记SPACE .output += [ [ "line format", "SPACE", ([ $line.products[].name ] | join(",")), "end line format" ] | join("|") ] end end ) | .output[], ["END", "0"] | join("|")
运行输出
"line format|MARK|Should be MARK|end line format" "line format|MARK|Should be MARK,Addon to MARK|end line format" "line format|MARK|Should be MARK First igroup=true BROKEN!!!|end line format" "line format|SPACE|Should be SPACE !! After first igroup=true|end line format" "line format|SPACE|Should be SPACE until next igroup=false|end line format" "line format|MARK|Should be MARK|end line format" "END|0"
逻辑说明
- 状态变量
seen_first_true用来记录当前是否已经输出过连续igroup=true序列的第一个元素 - 每次遇到
igroup=false时会重置seen_first_true,保证后续新的igroup=true序列第一个元素可以正确标记为MARK - 遍历所有行生成输出数组后,统一追加结束行并输出
内容的提问来源于stack exchange,提问作者dksayers
相关产品推荐
相关产品推荐

