如何在jq中不使用reverse实现降序及多列混合排序?
解决jq多列混合升降序排序无需双重reverse的方案
要实现city降序、person升序的多列排序,无需依赖两次reverse,可以用以下两种更高效的方式:
方法一:利用sort_by生成反向排序键
sort_by支持传入多个排序字段,我们可以对需要降序的字段进行转换,让升序排序的结果等价于原字段的降序:
场景1:city是数值类型
直接对city取负值,升序排序-.city就等价于原city的降序:
sort_by(-.city, .person)
执行逻辑:先按-.city升序(即原city降序),city相同时按.person升序,完全符合需求。
场景2:city是字符串类型
字符串无法直接取负,可将其转换为ASCII码总和的负值,通过数值排序实现字符串的降序:
sort_by(-(.city | ascii_downcase | [chars[]] | map(ord) | add), .person)
逻辑说明:将city字符串转小写后,逐个字符取ASCII码并求和,取负值后升序排序,等价于原字符串的降序排列;city相同时仍按person升序排序。
方法二:使用自定义比较函数的sort
jq 1.6及以上版本支持sort/1,可以传入自定义比较函数,直接定义排序规则:
sort( # 先比较city,city大的排在前面(降序) .[0].city != .[1].city ? (.[0].city > .[1].city ? -1 : 1) # city相同时,person小的排在前面(升序) : (.[0].person < .[1].person ? -1 : 1) )
这个函数直接定义了排序优先级:优先按city降序,city相同则按person升序,完全不需要依赖reverse或sort_by的二次处理,性能更优。
内容的提问来源于stack exchange,提问作者xakepp35
相关产品推荐
相关产品推荐

