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

如何用DataWeave从静态Payload提取多产品数据并合并结果

多产品Code查询的DataWeave代码修改方案

需求说明

现有DataWeave代码仅支持单个产品code查询并返回对应结果,需修改为支持传入多个code(格式如"2698791-01, 9696379-01, 9696377-01"),提取所有匹配的产品数据并合并为指定结构的JSON结果。

静态Payload

[
{"products": [{"code": "2698791-01", "url": "https://www.product.com/268791-01.png", "basePrice": {"value": 679.00, "formattedValue": "679,00 €"}, "name": "Product 1 Pro", "friendlyName": "Pro"}]},
{"products": [{"code": "9696379-01", "url": "https://www.product.com/966379-01.png", "basePrice": {"value": 2.90, "formattedValue": "2,90 €"}, "name": "Product 2 Ultra", "friendlyName": "Ultra"}]},
{"products": [{"code": "9696377-01", "url": "https://www.product.com/966377-01.png", "basePrice": {"value": 72.90, "formattedValue": "72,90 €"}, "name": "Product 3 Plus", "friendlyName": "Plus"}]}
]

现有代码(仅支持单个code)

%dw 2.0
output application/json

var id = "1234"
var code = "9696379-01"

var idObj = {
    "currency": "EUR",
    "id": id
    }


var productObj = payload
var fileData = productObj filter ((item, index) -> item.products.code == [code]) 
 
---
idObj ++ fileData[0]

预期输出

{
  "currency": "EUR",
  "id": "1234",
  "products": [
    {"code": "2698791-01", "url": "https://www.product.com/268791-01.png", "basePrice": {"value": 679.00, "formattedValue": "679,00 €"}, "name": "Product 1 Pro", "friendlyName": "Pro"},
    {"code": "9696379-01", "url": "https://www.product.com/966379-01.png", "basePrice": {"value": 2.90, "formattedValue": "2,90 €"}, "name": "Product 2 Ultra", "friendlyName": "Ultra"},
    {"code": "9696377-01", "url": "https://www.product.com/966377-01.png", "basePrice": {"value": 72.90, "formattedValue": "72,90 €"}, "name": "Product 3 Plus", "friendlyName": "Plus"}
  ]
}

修改后的DataWeave代码

%dw 2.0
output application/json

var id = "1234"
var codeStr = "2698791-01, 9696379-01, 9696377-01"
// 将逗号分隔的code字符串转为去空格后的数组
var targetCodes = codeStr splitBy "," map trim($)

var idObj = {
    "currency": "EUR",
    "id": id
}

// 过滤出产品code在目标数组中的项,再扁平化所有products列表
var matchedProducts = payload 
    filter ((item) -> item.products.code[0] in targetCodes)
    flatMap ($.products)

---
idObj ++ { products: matchedProducts }

关键改动说明

  • 处理多code输入:使用splitBy ","分割字符串,再用trim($)去除每个code前后的空格,生成干净的目标code数组
  • 调整过滤逻辑:通过item.products.code[0] in targetCodes判断当前项的产品code是否在目标列表中(因原Payload每个item的products是单元素数组,所以取code[0])
  • 合并产品列表:用flatMap将所有匹配项的products数组扁平化,合并为一个统一的产品数组
  • 组装最终结构:将idObj与包含合并后产品数组的对象合并,得到预期的JSON结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:14:58