Mule 4中基于另一对象数组更新目标对象数组的需求
问题描述
需要基于Input 1数组的数值,更新Input 2数组中的对象属性值,具体规则如下:
- 当两个数组中对象的
id匹配时:- 对于
FieldName2:若当前值为非0的key(如Dummy1),则用Input 1中同id且key匹配的value替换;若Input 1中无对应key,则使用该对象自身的FieldValue - 对于
FieldName3:若当前值为非0的key(如Dummy2),则用Input 1中同id且key匹配的value替换;若值为0则保持不变
- 对于
输入示例
Input 1
[ { "id": 123, "key": "Dummy1", "value": "20" }, { "id": 123, "key": "Dummy2", "value": "50" }, { "id": 123, "key": "Dummy3", "value": "100" }, { "id": 789, "key": "Dummy2", "value": "40" }, { "id": 789, "key": "Dummy3", "value": "90" } ]
Input 2
[ { "id": 123, "FieldName": "Dummy1", "FieldValue": "20", "FieldName2": "Dummy1", "FieldName3": "0" }, { "id": 123, "FieldName": "Dummy1", "FieldValue": "20", "FieldName2": "Dummy1", "FieldName3": "Dummy2" }, { "id": 789, "FieldName": "Dummy1", "FieldValue": "10", "FieldName2": "Dummy1", "FieldName3": "0" }, { "id": 789, "FieldName": "Dummy1", "FieldValue": "10", "FieldName2": "Dummy1", "FieldName3": "Dummy2" } ]
预期输出
[ { "id": 123, "FieldName": "Dummy1", "FieldValue": "20", "FieldName2": "20", "FieldName3": "0" }, { "id": 123, "FieldName": "Dummy1", "FieldValue": "20", "FieldName2": "20", "FieldName3": "50" }, { "id": 789, "FieldName": "Dummy1", "FieldValue": "10", "FieldName2": "10", "FieldName3": "0" }, { "id": 789, "FieldName": "Dummy1", "FieldValue": "10", "FieldName2": "10", "FieldName3": "40" } ]
解决方案(JavaScript实现)
先把Input 1转换成按id分组的映射表,避免重复遍历数组影响效率,再遍历Input 2逐个更新字段。
// 把Input1转换成id -> {key: value}的映射 const buildIdKeyMap = (input1) => { return input1.reduce((map, item) => { if (!map[item.id]) { map[item.id] = {}; } map[item.id][item.key] = item.value; return map; }, {}); }; // 按规则更新Input2数组 const updateTargetArray = (input1, input2) => { const idKeyMap = buildIdKeyMap(input1); return input2.map(item => { const currentIdMap = idKeyMap[item.id] || {}; // 处理FieldName2 let updatedField2 = item.FieldName2; if (updatedField2 !== '0') { updatedField2 = currentIdMap[updatedField2] || item.FieldValue; } // 处理FieldName3 let updatedField3 = item.FieldName3; if (updatedField3 !== '0') { updatedField3 = currentIdMap[updatedField3] || updatedField3; } // 返回新对象,不修改原数组 return { ...item, FieldName2: updatedField2, FieldName3: updatedField3 }; }); }; // 示例调用 const input1 = [/* 填入Input1的数组内容 */]; const input2 = [/* 填入Input2的数组内容 */]; const result = updateTargetArray(input1, input2); console.log(result);
代码说明
buildIdKeyMap函数:将Input1转换为{ id: { key: value } }的结构,比如123: { Dummy1: '20', Dummy2: '50' },后续可以直接通过id和key快速取值。updateTargetArray函数:- 遍历Input2的每个对象,根据id获取对应的key-value映射
- 对
FieldName2:非0值优先用映射中的对应value,没有则用自身的FieldValue - 对
FieldName3:非0值用映射中的对应value替换,无对应值则保持原值 - 返回新数组,避免修改原输入数据
内容的提问来源于stack exchange,提问作者Kunal Awasthi
相关产品推荐
相关产品推荐

