Это то, что я придумал, возможно, это можно было бы немного упростить, если бы у меня было больше времени на это. Попробуйте:
%dw 2.0
output application/xml
var data = [
{
"ClientCode": "1",
"ClientItemCode": "245",
"LocationId": "CLOSED"
},
{
"ClientCode": "1",
"ClientItemCode": "245",
"LocationId": "OPEN"
},
{
"ClientCode": "2",
"ClientItemCode": "245",
"LocationId": "CHECKOUT"
},
{
"ClientCode": "2",
"ClientItemCode": "245",
"LocationId": "TEST"
},
{
"ClientCode": "1",
"ClientItemCode": "123",
"LocationId": "OPEN"
},
{
"ClientCode": "1",
"ClientItemCode": "123",
"LocationId": "CLOSED"
}
]
---
// I assume that your data are ordered and all the records that will be From and To
// are paired with one another. It is doable without making such assumption but the
// algorithm will get complex.
results: do {
// Group by the data
var groupedData = data map {($),(From: true) if (isEven($$))} groupBy $.ClientItemCode
// Order the client Ids
var orderedClientIds = groupedData pluck $$ orderBy $ as Number
---
orderedClientIds reduce (cId, results={}) -> do {
var clientItemCode = cId
var groupedByClientICode = groupedData[cId] groupBy $.ClientCode pluck $
---
results ++ {result: {
ClientItemCode: clientItemCode,
ResultLines: groupedByClientICode reduce (cliCode, lines={}) -> do {
var clientCode = cliCode[0].ClientCode
---
lines ++ {
ClientCode: clientCode,
ResultLine: cliCode reduce (e, acc={}) -> do {
var locRec = {LocationId: e.LocationId}
---
acc ++ (if (e.From?) {From: locRec } else {To: locRec})
}
}
}
}}
}
}
Я также сделал предположение, повторяя в комментариях: я предполагаю, что ваши данные упорядочены и все записи, которые будут From
и To
, связаны с друг друга.
РЕДАКТИРОВАТЬ: Еще раз отредактировал код, чтобы принудительно выполнить сортировку ClientItemCode
, а затем получить доступ к каждому из значений по порядку перед всеми преобразованиями при создании тегов result
. Остальной код почти такой же, как и раньше. Не уверен, почему простой orderBy
не сработал для вас, он сработал для меня.