如何在DataWeave中用另一数组选择性更新对象数组中count=1的字段
数组更新解决方案:仅替换指定条件对象并保留顺序
需求说明
- 仅更新Array 1中
count值为1的对象 - 用Array 2中**
name字段匹配**的对象覆盖对应字段 - 严格保留Array 1的原始顺序
- 注意:Array 2中的
count为字符串类型,需转为数字以匹配Array 1的类型
解决方案思路
- 将Array 2转换为以
name为键的映射对象,实现O(1)时间复杂度的快速查找 - 遍历Array 1,对每个对象做如下处理:
- 若对象
count≠1,直接保留原对象 - 若对象
count=1,从映射中取出对应name的对象,合并覆盖字段(同时转换count类型)
- 若对象
- 返回处理后的新数组(不修改原数组)
代码实现(JavaScript)
const array1 = [ { "count": 3, "classification": "Group", "id": "", "name": "A3200003" }, { "count": 1, "classification": "Group", "id": "", "name": "A4000006" }, { "count": 1, "classification": "Group", "id": "", "name": "A5E02528190" } ]; const array2 = [ { "count": "1", "classification": "Hardware", "id": "34265711", "name": "A4000006" }, { "count": "1", "classification": "Hardware", "id": "127029226", "name": "A5E02528190" } ]; // 构建Array2的name映射,同时转换count为数字类型 const array2NameMap = array2.reduce((map, item) => { map[item.name] = { ...item, count: Number(item.count) }; return map; }, {}); // 处理Array1生成结果 const updatedArray = array1.map(obj => { if (obj.count !== 1) { return {...obj}; // 返回原对象副本,避免污染原数组 } // 合并原对象与映射中的匹配对象,覆盖字段 return {...obj, ...array2NameMap[obj.name]}; }); // 输出结果 console.log(JSON.stringify(updatedArray, null, 2));
输出结果
[ { "count": 3, "classification": "Group", "id": "", "name": "A3200003" }, { "count": 1, "classification": "Hardware", "id": "34265711", "name": "A4000006" }, { "count": 1, "classification": "Hardware", "id": "127029226", "name": "A5E02528190" } ]
内容的提问来源于stack exchange,提问作者SH4444KO
相关产品推荐
相关产品推荐

