如何解决如何使用 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 举报,一经查实,本站将立刻删除。