微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 jmespath 对 ASC 和 DESC 进行排序

如何解决如何使用 jmespath 对 ASC 和 DESC 进行排序

我需要有关表达式的帮助,以便对同一数据进行升序和降序排序。

我可以用管道分隔多个表达式,但我似乎找不到在同一个调用中同时执行 ASC 和 DESC 的任何示例。

所以我要找的就是下面的SQL查询

select * 
from dummyData 
order by id,code desc,update_only

这是示例。

[
  {
    "id": 1,"code": "y","update_only": 0.0
  },{
    "id": 2,"code": "a",{
    "id": 1,"code": "z","code": "b","update_only": 0.0
  }
]

我可以做以下订购

sort_by(array elements,expression->number|expression->string expr)

如何通过一个调用而不是两个调用来执行以下操作?

sort_by(myarray,&id | &update_only)[];
reverse(sort_by(myarray,&code))[];

或者通过多次调用,也不想这样做。

result1 = sort_by(myarray,&id)[];
result2 = reverse(sort_by(result1,&code))[];
resilt3 = sort_by(myarray,&update_only)[];

解决方法

你的实际表达是不正确的,你会意识到,如果你改变 update_only 的值,&id | &update_only 不是一个东西。

文档中描述的内容:

expression->number|expression->string expr

实际上意味着表达式可以是字符串类型或数字类型,而不是您可以使用管道符号链接多个排序。

此处对此进行了解释:

JMESPath 具有各种内置函数,可对不同的数据类型进行操作,如下所述。下面的每个函数都有一个签名,用于定义预期的输入类型和返回输出的类型:

return_type function_name(type $argname)
return_type function_name2(type1|type2 $argname)

函数支持的数据类型列表是:

  • 数字(JSON 中的整数和双精度浮点格式)
  • 字符串
  • 布尔值(真或假)
  • 数组(有序的值序列)
  • object(键值对的无序集合)
  • 表达式(用 &expression 表示)

除了最后一项,以上所有类型都对应JSON提供的类型。

如果一个函数可以接受一个输入值的多种类型,那么多种类型用 | 分隔。如果解析的参数与签名中指定的类型不匹配,则会发生无效类型错误。

来源:https://jmespath.org/specification.html#built-in-functions,重点,我的


现在,想要实现的目标很简单。
当您对多个列进行排序时,就像将排序链接起来,从低优先级到高优先级。

所以这意味着你可以(用伪代码):

sort by id (
  reverse (
    sort by code (
      reverse (  
      // ^--- this is the trick,so when you will reverse it
      // again,to have the DESC sorting on `code`,you'll end
      // up with the sorting of `update_only` in the "correct" order
        sort by update_only
      )
    )
  )
)

所以,翻译成 JEMSPath 表达式:

sort_by(reverse(sort_by(reverse(sort_by(@,&update_only)),&code)),&id)

以下 JSON 上的此表达式(从您的示例中添加了一个额外的案例以展示 update_only 排序:

[
  {
    "id": 1,"code": "y","update_only": 0.0
  },{
    "id": 2,"code": "a",{
    "id": 1,"code": "z","code": "b","update_only": 1.0
  },"update_only": 0.0
  }
]

会给:


[
  {
    "id": 1,"update_only": 0
  },"update_only": 1
  },"update_only": 0
  }
]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。