You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:20:44