You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在特定产品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 $

代码逻辑说明

  1. 定义目标组合:把需要检查的两组产品ID存入targetCombinations,方便后续批量判断。
  2. 按订单分组:用groupBy把所有产品按orderId分组,确保每个订单的产品集合独立处理。
  3. 组合存在性判断:通过some(任意一组满足)和every(组合内两个ID都存在),快速判断当前订单是否包含完整的目标组合。
  4. 产品过滤:如果存在完整组合,就过滤掉该组合内的所有产品;否则保留全部产品。
  5. 结果平铺:用flatten把分组后的多维数组转回原有的一维数组结构。

内容的提问来源于stack exchange,提问作者Nagesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:52:42