如何在特定产品ID组合共存时过滤对象数组?
正确处理订单产品组合过滤的DataWeave解决方案
输入输出示例
输入Payload
[ {"orderId": "ORD001", "productId": "454.110600"}, {"orderId": "ORD001", "productId": "891.010000"}, {"orderId": "ORD001", "productId": "123.456789"}, {"orderId": "ORD002", "productId": "824.010000"}, {"orderId": "ORD002", "productId": "890.010000"}, {"orderId": "ORD003", "productId": "454.110600"}, {"orderId": "ORD003", "productId": "824.010000"}, {"orderId": "ORD004", "productId": "891.010000"} ]
预期输出
[ {"orderId": "ORD001", "productId": "123.456789"}, {"orderId": "ORD003", "productId": "454.110600"}, {"orderId": "ORD003", "productId": "824.010000"}, {"orderId": "ORD004", "productId": "891.010000"} ]
原代码问题分析
原代码逻辑完全偏离需求:它直接把所有在product数组中的产品全部过滤掉,但我们的需求是仅当同一订单下同时存在指定产品组合时,才删除该组合内的产品;单独存在的目标产品需要保留。
正确的DataWeave代码
%dw 2.0 output application/json // 定义需要检查的两组目标产品ID组合 var targetCombinations = [ ["454.110600", "891.010000"], ["824.010000", "890.010000"] ] --- // 按orderId分组处理每个订单的产品集合 (payload groupBy $.orderId) pluck (items, orderId) -> do { // 提取当前订单下的所有productId并转为Set,提升判断效率 var currentProductIds = items.productId as Set // 检查当前订单是否包含任意一组完整的目标产品组合 var hasFullCombination = targetCombinations some (comb -> comb every ($ in currentProductIds)) // 根据判断结果过滤产品:存在完整组合则删除组合内产品,否则保留全部 if (hasFullCombination) items filter (item -> !(targetCombinations flatten contains item.productId)) else items } // 将分组后的结果平铺回一维数组 flatten $
代码逻辑说明
- 定义目标组合:把需要检查的两组产品ID存入
targetCombinations,方便后续批量判断。 - 按订单分组:用
groupBy把所有产品按orderId分组,确保每个订单的产品集合独立处理。 - 组合存在性判断:通过
some(任意一组满足)和every(组合内两个ID都存在),快速判断当前订单是否包含完整的目标组合。 - 产品过滤:如果存在完整组合,就过滤掉该组合内的所有产品;否则保留全部产品。
- 结果平铺:用
flatten把分组后的多维数组转回原有的一维数组结构。
内容的提问来源于stack exchange,提问作者Nagesh
相关产品推荐
相关产品推荐

