问题描述
(PS:下面是一个简单的例子来解释我的需求。实际数据要庞大和复杂得多。)
我有一个可用作订单项的行列表。我需要动态分组这些行项目并为每个组构建一个标题。如果你能遵循结构。
1:input structure output structure
我已经实现了逻辑,但它只考虑替代行 v.i.z 数组 [0],1,[4],[6]。 1、3、5 等缺失
这是我在数据编织器转换消息中的逻辑:
%dw 2.0
output application/java
---
flatten(payload map ((item,index) ->
[{
"type":"header","name":"","code":payload[index].code,"status":payload[index].status
},{
"type":"lineitem","name":payload[index].name,"code":"","status":""
}]
想法基本上是将每一行拆分为标题和行项目。 并在订购行项目后的下一步中删除重复的标题。 除了下一步中缺少替代行(通过使用索引标记行进行验证)之外,所有这些都有效。
我也在努力删除数组字段。例如有效载荷 - “状态”不起作用。
如果有人可以提出更简单的方法或帮助我理解为什么缺少替代行,那就太好了。
解决方法
试试这个
输入:
name,code,status
a,yes,active
b,active
c,no,inactive
d,inactive
e,inactive
f,inactive
g,active
h,active
i,inactive
j,inactive
k,active
l,active
脚本
%dw 2.0
output application/csv
var headerGroups = (payload groupBy (item,index) -> (item.status ++ "_" ++ item.code)) mapObject
($$): {
"type":"header","name":"","code":$[0].code,"status":$[0].status
}
var nameHeaderGroups= (payload groupBy (item,index) -> (item.status ++ "_" ++ item.code)) mapObject
($$): {
"name":[$.name]
}
fun buildNameObject(nameArray) = nameArray map
{
"temp": ($ map {
"type":"lineItem","name": $,"code":"","status":""
}
)}
---
flatten(nameHeaderGroups mapObject {
a: {(headerGroups[$$])},b: {(buildNameObject($.name))}.temp
}pluck ($)
)
输出:
type,name,status
header,active
lineItem,a,lineItem,b,k,l,header,inactive
lineItem,c,d,i,j,e,f,g,h,
这应该可以帮助您实现目标。它确实根据状态和代码组合对行项目进行了分组。如果顺序很重要,您也可以添加它。
,假设有两行状态和代码相似但名称不同的行,也许下面的解决方案可以满足您的需求。
输入:
name,active
脚本:
%dw 2.0
output application/csv headerLineNumber=0
var headerCalc = (payload groupBy (item,index) -> (item.name ++ "_" ++ item.status ++ "_" ++ item.code)) mapObject
($$):{
"type":"header","name":$.name,"status":$[0].status
}
---
flatten(payload map ((item,index) ->
if((headerCalc[item.name ++ "_" ++ item.status ++ "_" ++ item.code].name contains item.name) and (isEven(index) or (index == 0)))
[{
"type":"header","code":headerCalc[item.name ++ "_" ++ item.status ++ "_" ++ item.code].code,"status":headerCalc[item.name ++ "_" ++ item.status ++ "_" ++ item.code].status
}] ++
[{
"type":"lineitem","name":payload[index].name,"status":""
}]
else
[{
"type":"lineitem","status":""
}]))
输出:
type,active
lineitem,lineitem,inactive
lineitem,