DataWeave嵌套数组排序:按Ticket最新Timestamp降序排列客户
DataWeave 嵌套数组排序解决方案
核心思路
- 先对每个客户的
tickets数组按timestamp降序排列 - 提取所有客户(跨所有offer),按其
tickets中最新的timestamp值降序排序 - 可选:保留原offer结构,仅对每个offer下的客户按规则排序
示例输入
{ "offers": [ { "offerId": "Offer1", "customers": [ { "customerId": "50001", "tickets": [ {"ticketId": "T1", "timestamp": "2024-01-01T10:00:00Z"}, {"ticketId": "T2", "timestamp": "2024-01-03T14:30:00Z"} ] }, { "customerId": "50002", "tickets": [ {"ticketId": "T3", "timestamp": "2024-01-05T09:15:00Z"}, {"ticketId": "T4", "timestamp": "2024-01-06T16:45:00Z"} ] } ] }, { "offerId": "Offer2", "customers": [ { "customerId": "60001", "tickets": [ {"ticketId": "T5", "timestamp": "2024-01-04T11:20:00Z"} ] } ] } ] }
方案1:扁平化所有客户并排序
该方案将所有offer下的客户合并为一个列表,按规则排序(示例中客户50002会排在首位):
%dw 2.0 output json --- // 先处理每个客户的tickets排序,再收集所有客户并按最新ticket时间排序 flatten(payload.offers map ($.customers map ( $ update { case tickets -> tickets orderBy ($.timestamp) reverse } ))) orderBy (max($.tickets.timestamp)) reverse
方案2:保留原Offer结构并排序客户
该方案保持offer层级不变,仅对每个offer下的客户按规则排序:
%dw 2.0 output json --- payload update { case offers -> offers map ( $ update { case customers -> customers map ( $ update { case tickets -> tickets orderBy ($.timestamp) reverse } ) orderBy (max($.tickets.timestamp)) reverse } ) }
关键说明
orderBy ($.timestamp) reverse:对单个客户的tickets数组按timestamp降序排列max($.tickets.timestamp):提取当前客户所有ticket中最新的时间戳,作为客户排序的核心依据flatten():将嵌套在各offer下的客户数组合并为一维数组(仅方案1使用)
内容的提问来源于stack exchange,提问作者Hasan Limon
相关产品推荐
相关产品推荐

