如何用jq将数组奇偶索引元素转为键值对并解析Solr 6.5指标?
解决Solr 6.5指标数组的奇偶元素配对问题
嗨,我完全懂你要处理的这个需求!把Solr指标数组里的奇偶位置元素配对成键值对对象,确实是jq处理数组时很典型的场景,你猜的没错,map或者类似的遍历操作是核心,我给你两种靠谱的实现方法:
方法一:用_nwise快速分组(推荐)
如果你的jq版本支持_nwise(Solr 6.5对应的环境一般都支持),这是最简洁的写法。它能直接把数组按指定长度分组,刚好适配我们“每两个元素一组”的需求。
假设你的Solr指标数据结构大概是这样:
{ "metrics": [ "solr.core.search.queryTime", 123, "solr.core.search.requests", 456, "solr.core.cache.hits", 789 ] }
对应的jq命令如下:
.metrics | _nwise(2) | map({(.[0]): .[1]}) | add
拆解每个步骤:
.metrics:先提取出指标数组_nwise(2):把数组拆成每两个元素一组的子数组,结果会变成:[["solr.core.search.queryTime",123], ["solr.core.search.requests",456], ["solr.core.cache.hits",789]]map({(.[0]): .[1]}):遍历每个子数组,将第一个元素作为键、第二个作为值生成单个对象,比如每个子数组会变成{"solr.core.search.queryTime":123}add:把所有小对象合并成一个完整的键值对对象
最终输出会是:
{ "solr.core.search.queryTime": 123, "solr.core.search.requests": 456, "solr.core.cache.hits": 789 }
方法二:用reduce兼容旧版jq
如果你的jq版本比较旧,不支持_nwise,可以用reduce来手动遍历偶数索引的元素,逐一构建对象:
.metrics | reduce range(0; length; 2) as $i ({}; . + {(.[$i]): .[$i+1]})
逻辑说明:
range(0; length; 2):生成从0开始、步长为2的索引序列(也就是所有偶数位置的索引)reduce ... ({}; ...):从空对象{}开始,每次把当前索引$i对应的元素作为键,$i+1对应的元素作为值,添加到结果对象中
小提示
如果你的指标数组长度是奇数(比如最后多了一个无对应值的元素),可以先处理一下数组:
.metrics | if length % 2 == 1 then .[:-1] else . end | _nwise(2) | map({(.[0]): .[1]}) | add
这段代码会自动去掉最后一个孤立的元素,避免配对出错。
内容的提问来源于stack exchange,提问作者Gopal Agarwal
相关产品推荐
相关产品推荐

