如何使用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" } ]
实现思路
- 先将所有对象存入以
Key为键的映射表,方便快速定位父对象; - 遍历每个对象,判断是否为子对象:若当前对象的
Key可分割出存在于映射表中的父Key(去掉Key最后一段-xxx后的字符串),则将其Amount累加到父对象的Amount中; - 最后过滤掉所有子对象,仅保留父对象。
代码实现(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
相关产品推荐
相关产品推荐

