Mule4中如何对日期格式键的对象实现反向排序?
如何在DataWeave中对日期键的对象进行降序排序?
问题描述
现有如下DataWeave脚本,目标是对以ISO格式日期为键的对象进行降序排序,但当前使用test orderBy $$只能得到升序结果,尝试过-$$、[-1 to 0]以及转换为LocalDateTime的方式均未成功:
%dw 2.0 output application/json var test = { "2022-10-19T10:59:00.000Z":[{"kio":"spotage"}], "2022-10-17T10:59:00.000Z": [{"kio":"spotage"}], "2022-10-18T10:59:00.000Z": [{"kio":"spotage"}] } --- test orderBy $$
期望得到的降序结果:
{ "2022-10-19T10:59:00.000Z": [ { "kio": "spotage" } ], "2022-10-18T10:59:00.000Z": [ { "kio": "spotage" } ], "2022-10-17T10:59:00.000Z": [ { "kio": "spotage" } ] }
解决方案
方法1:日期转换+负号实现降序
核心是先将字符串类型的键转换为DateTime类型(原日期带时区标识Z,不能用LocalDateTime),再通过取负值实现降序排序:
%dw 2.0 output application/json var test = { "2022-10-19T10:59:00.000Z":[{"kio":"spotage"}], "2022-10-17T10:59:00.000Z": [{"kio":"spotage"}], "2022-10-18T10:59:00.000Z": [{"kio":"spotage"}] } --- test orderBy -(($$ as DateTime))
方法2:使用orderByDesc(DataWeave 2.4+ / Mule 4.4+ 可用)
如果运行环境支持DataWeave 2.4或更高版本,可直接用orderByDesc函数,写法更直观:
%dw 2.0 output application/json var test = { "2022-10-19T10:59:00.000Z":[{"kio":"spotage"}], "2022-10-17T10:59:00.000Z": [{"kio":"spotage"}], "2022-10-18T10:59:00.000Z": [{"kio":"spotage"}] } --- test orderByDesc ($$ as DateTime)
关键说明
- 之前尝试
-$$失败是因为$$是字符串类型,负号对字符串排序无效,必须先转换为日期类型。 - 不能用
LocalDateTime转换带时区的日期,会导致转换错误或排序逻辑异常,应使用DateTime类型适配带时区的ISO日期格式。
内容的提问来源于stack exchange,提问作者Star
相关产品推荐
相关产品推荐

