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

如何使用DataWeave汇总数组中父子对象的Amount值并保留父对象

合并父子对象并累加金额

需求说明

给定一组包含父子层级关系的对象数组,对象间的父子关系由Key字段标识:子对象的Key是父对象Key后追加-xxx格式的后缀(例如109-200C-001是109-200C的子对象)。处理后需仅保留父对象,且父对象的Amount字段为自身与所有对应子对象的Amount值之和。

输入示例

[
    {
        "Class": 1,
        "Amount": 2,
        "Key": "109-200C-001"
    },
    {
        "Class": 3,
        "Amount": 4,
        "Key": "109-200C"
    },
    {
        "Class": 8,
        "Amount": 7,
        "Key": "xyz-123-007"
    },
    {
        "Class": 8,
        "Amount": 4,
        "Key": "xyz-123"
    }
]

实现思路

  1. 先将所有对象存入以Key为键的映射表,方便快速定位父对象;
  2. 遍历每个对象,判断是否为子对象:若当前对象的Key可分割出存在于映射表中的父Key(去掉Key最后一段-xxx后的字符串),则将其Amount累加到父对象的Amount中;
  3. 最后过滤掉所有子对象,仅保留父对象。

代码实现(JavaScript)

const input = [
    {"Class": 1, "Amount": 2, "Key": "109-200C-001"},
    {"Class": 3, "Amount": 4, "Key": "109-200C"},
    {"Class": 8, "Amount": 7, "Key": "xyz-123-007"},
    {"Class": 8, "Amount": 4, "Key": "xyz-123"}
];

// 构建Key到对象的映射
const keyMap = new Map(input.map(item => [item.Key, {...item}]));

// 遍历处理子对象的金额累加
for (const item of input) {
    const keyParts = item.Key.split('-');
    if (keyParts.length > 1) {
        const parentKey = keyParts.slice(0, -1).join('-');
        const parentItem = keyMap.get(parentKey);
        if (parentItem) {
            parentItem.Amount += item.Amount;
        }
    }
}

// 过滤出父对象:无其他对象的Key以当前Key为前缀且长度更长
const result = Array.from(keyMap.values()).filter(parent => {
    return !input.some(item => item.Key.startsWith(parent.Key) && item.Key !== parent.Key);
});

console.log(JSON.stringify(result, null, 2));

输出结果

[
  {
    "Class": 3,
    "Amount": 6,
    "Key": "109-200C"
  },
  {
    "Class": 8,
    "Amount": 11,
    "Key": "xyz-123"
  }
]

内容的提问来源于stack exchange,提问作者Mule-Newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:12:43