MuleSoft DataWeave优化:按商品组计算总价的更优方案问询
优化DataWeave按商品组计算总价的方案
你当前的实现硬编码了每个商品组的总价计算逻辑,扩展性很差——新增商品组时必须修改代码。下面是更简洁通用的优化方案:
优化后代码
// input var varinput1 = [ { "artname": "appelmoes", "artgroup": "groenten", "price": 4.20 }, { "artname": "rode kool", "artgroup": "groenten", "price": 3.20 }, { "artname": "tarvo brood", "artgroup": "brood & banket", "price": 1.20 }, { "artname": "krentebrood", "artgroup": "brood & banket", "price": 0.80 }, { "artname": "vlaai", "artgroup": "brood & banket", "price": 20.40 }, { "artname": "beckers frikandellen", "artgroup": "vries", "price": 10.40 }, { "artname": "magnum ijs", "artgroup": "vries", "price": 4.40 }, ] output application/json skipNullOn="everywhere" --- varinput1 groupBy $.artgroup pluck ((items, groupName) -> { // 动态生成总价键名,处理特殊字符并格式化 (("TotalPrice" ++ groupName replace /[\s&]/ with "" capitalizeEach): items.price reduce ($$ + $)) })
输出结果
[ { "TotalPriceGroenten": 7.40 }, { "TotalPriceBroodbanket": 22.40 }, { "TotalPriceVries": 14.80 } ]
核心优化点
- 完全动态化:不再硬编码任何商品组名称,新增/删除商品组时无需修改代码
- 简化求和逻辑:直接对分组后的
price数组用reduce求和,默认初始值为0,无需额外空值判断 - 键名自动格式化:通过正则替换去掉组名中的空格和
&,再用capitalizeEach实现首字母大写,统一键名格式
如果需要和你原输出的TotalPricebroodenBanket完全一致(把"brood & banket"转为"broodenBanket"),可以调整键名生成逻辑为:
(("TotalPrice" ++ (groupName replace " & " with "en" replace /\s/ with "") capitalizeEach): items.price reduce ($$ + $))
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

