Mule4中使用DataWeave生成多个JSON数组的所有可能组合
Mule 4 DataWeave 动态多数组组合生成实现方案
核心逻辑通过自定义递归函数实现任意数量数组的笛卡尔积计算,无需硬编码数组数量,完美适配3~4个动态输入数组的场景。
实现代码
%dw 2.0 output application/json // 递归生成任意数量数组的笛卡尔积 fun cartesian(arrays: Array<Array<Any>>): Array<Array<Any>> = if(sizeOf(arrays) == 1) arrays[0] map (item) -> [item] else flatten(arrays[0] map (currItem) -> cartesian(arrays[1 to -1]) map (restComb) -> [currItem] + restComb ) // 提取输入中所有数组的名称与值对 var arrList = payload pluck ((value, key) -> {name: key as String, items: value}) // 生成所有元素组合 var allCombinations = cartesian(arrList map $.items) --- // 格式化输出为要求的结构 allCombinations map ((comb, idx) -> { ("itenary " ++ (idx + 1)): { // 映射每个项的属性 (comb map ((item, cIdx) -> if(arrList[cIdx].name == "hotels") {"hotelDetails": item} else {(arrList[cIdx].name): item} )), // 计算套餐总成本,自动适配不同成本字段,字符串成本转数值 TripPackage: sum(comb map (item) -> sum(item filterObject ((v, k) -> k as String matches /.*Cost$/ ) map (v) -> v as Number)) } }) reduce ((item, acc = {}) -> acc ++ item)
代码说明
- 动态适配:自动识别输入中的所有JSON数组,不管是3个、4个还是更多都可以自动生成所有元素的组合,不需要修改代码逻辑
- 格式兼容:自动将
hotels数组的项映射为hotelDetails属性,其他数组名称直接保留为属性名 - 成本自动计算:自动识别所有字段名带
Cost后缀的数值,自动转换字符串类型的成本为数字后累加得到TripPackage
注:你提供的预期输出中的成本数值为示例测试值,代码会按输入的实际数值计算总成本
内容的提问来源于stack exchange,提问作者Naga Raj
相关产品推荐
相关产品推荐

