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

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)

代码说明

  1. reduce函数的作用:遍历Payload数组,每次迭代将更新后的库存列表(updatedStock)作为下一次迭代的输入,实现状态累积。
  2. 更新逻辑优化:在updateStock函数中加入了item.qty >= qty的判断,符合需求中“Payload的qty小于等于Available对应条目qty”的条件;同时补充了item_id字段的生成,匹配预期结果格式。
  3. 省略result调用:通过reduce直接返回最终累积更新后的数组,无需单独定义result变量,简化了代码结构。

关于省略result调用的说明

可以完全省略原来的result变量和do块结构,使用reduce是更简洁的方式——它天然支持状态的累积传递,不需要额外的变量来暂存中间结果,直接通过迭代参数传递更新后的状态即可。

内容的提问来源于stack exchange,提问作者Jesus Abraham Felix González

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:25:53