DataWeave迭代Payload时如何保留Available数组的更新状态?
解决DataWeave累积更新Available数组的问题
编写DataWeave代码时遇到以下问题:现有两个对象数组Available和Payload,需求是遍历Payload,若条目与Available中的条目number匹配,且Payload的qty小于等于Available对应条目qty,则从Available对应条目的qty中减去该值,且迭代过程中需保留更新后的Available状态供下一次迭代使用。当前代码每次迭代都基于原始Available数组,生成多个独立的更新结果,无法得到累积更新后的单一预期结果,需要修改代码实现需求,同时想知道是否可省略result调用或用其他方式执行更新。
输入数据
Available数组
[ { "number": "61327", "qty": 1 }, { "number": "6010550", "qty": 1 }, { "number": "6010482", "qty": 1 }, { "number": "6228245", "qty": 1 }, { "number": "6076532", "qty": 1 } ]
Payload数组
[ { "number": "61327", "qty": 1 }, { "number": "6010550", "qty": 1 }, { "number": "6010482", "qty": 1 } ]
现有代码
%dw 2.0 output application/json fun updateValueFromAvailable( list, sku, qty ) = list map ( itm, idx ) -> (if ( itm.number ~= sku ) itm update { case .wms_qty -> itm.wms_qty - qty } else itm ) --- payload map do { var result = updateValueFromAvailable( available, $.number, $.qty ) --- $ }
当前错误结果
每次迭代基于原始Available生成独立结果,输出为多个数组:
[ [ { "number": "61327", "wms_qty": 0, "item_id": "61327" }, { "number": "6010550", "wms_qty": 1, "item_id": "6010550" }, { "number": "6010482", "wms_qty": 1, "item_id": "6010482" }, { "number": "6228245", "wms_qty": 1, "item_id": "6228245" }, { "number": "6076532", "wms_qty": 1, "item_id": "6076532" } ], [ { "number": "61327", "wms_qty": 1, "item_id": "61327" }, { "number": "6010550", "wms_qty": 0, "item_id": "6010550" }, { "number": "6010482", "wms_qty": 1, "item_id": "6010482" }, { "number": "6228245", "wms_qty": 1, "item_id": "6228245" }, { "number": "6076532", "wms_qty": 1, "item_id": "6076532" } ], [ { "number": "61327", "wms_qty": 1, "item_id": "61327" }, { "number": "6010550", "wms_qty": 1, "item_id": "6010550" }, { "number": "6010482", "wms_qty": 0, "item_id": "6010482" }, { "number": "6228245", "wms_qty": 1, "item_id": "6228245" }, { "number": "6076532", "wms_qty": 1, "item_id": "6076532" } ] ]
预期结果
累积更新后的单一Available数组:
[ { "number": "61327", "wms_qty": 0, "item_id": "61327" }, { "number": "6010550", "wms_qty": 0, "item_id": "6010550" }, { "number": "6010482", "wms_qty": 0, "item_id": "6010482" }, { "number": "6228245", "wms_qty": 1, "item_id": "6228245" }, { "number": "6076532", "wms_qty": 1, "item_id": "6076532" } ]
解决方案
要实现累积更新,需要使用DataWeave的reduce函数,它能在迭代过程中保留并传递更新后的状态,而不是每次都基于原始数组操作。
修改后的代码
%dw 2.0 output application/json // 单个更新逻辑:根据sku和qty更新库存列表 fun updateStock(stockList, sku, qty) = stockList map (item) -> if (item.number == sku and item.qty >= qty) item update { case .qty -> item.qty - qty case .wms_qty -> item.wms_qty - qty // 兼容结果中的wms_qty字段 case .item_id -> item.number // 补充item_id字段 } else item update { case .item_id -> item.number // 补充item_id字段 } --- // 使用reduce迭代Payload,逐步更新Available数组 payload reduce (item, updatedStock = available) -> updateStock(updatedStock, item.number, item.qty)
代码说明
reduce函数的作用:遍历Payload数组,每次迭代将更新后的库存列表(updatedStock)作为下一次迭代的输入,实现状态累积。- 更新逻辑优化:在
updateStock函数中加入了item.qty >= qty的判断,符合需求中“Payload的qty小于等于Available对应条目qty”的条件;同时补充了item_id字段的生成,匹配预期结果格式。 - 省略result调用:通过
reduce直接返回最终累积更新后的数组,无需单独定义result变量,简化了代码结构。
关于省略result调用的说明
可以完全省略原来的result变量和do块结构,使用reduce是更简洁的方式——它天然支持状态的累积传递,不需要额外的变量来暂存中间结果,直接通过迭代参数传递更新后的状态即可。
内容的提问来源于stack exchange,提问作者Jesus Abraham Felix González
相关产品推荐
相关产品推荐

