首页 > 解决方案 > 需要帮助在 mulesoft 中使用 dataweaver 为数组中的子行项目组构建标题项目(即时)

问题描述

(PS:下面是一个简化的例子来解释我的要求。真实的数据要庞大和复杂得多。)

我有一个可以用作行项目的行列表。我需要动态地对这些行项目进行分组并为每个组建立一个标题。如果你能遵循这个结构。

1输入结构 输出结构

我已经实现了逻辑,但它只考虑替代行,即数组 [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":""
}]

想法是基本上将每一行拆分为标题和行项目。并在订购订单项后在下一步中删除重复的标题。除了在下一步中缺少替代行(通过使用索引标记行进行验证)之外,所有这些都有效。

我也在努力删除一个数组字段。例如有效载荷 - “状态”不起作用。

如果有人可以提出一种更简单的方法或帮助我理解为什么缺少替代行,那就太好了。

标签: dataweavepayloadmule4

解决方案


试试这个

输入:

name,code,status
a,yes,active
b,yes,active
c,no,inactive
d,no,inactive
e,yes,inactive
f,yes,inactive
g,no,active
h,no,active
i,no,inactive
j,no,inactive
k,yes,active
l,yes,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,code,status
header,,yes,active
lineItem,a,,
lineItem,b,,
lineItem,k,,
lineItem,l,,
header,,no,inactive
lineItem,c,,
lineItem,d,,
lineItem,i,,
lineItem,j,,
header,,yes,inactive
lineItem,e,,
lineItem,f,,
header,,no,active
lineItem,g,,
lineItem,h,,

这应该可以帮助您实现目标。它确实根据状态和代码组合来分组排列项目。如果顺序很重要,您也可以添加它。


推荐阅读