如何使用DataWeave 2.0比较并合并两个JSON对象
深度合并两个JSON对象的实现方案
需求说明
需要合并两个JSON对象obj1和obj2,遵循以下规则:
- 当两个对象存在相同键时,取值优先来自
obj2 - 若
obj2中不存在某键,则保留obj1中的该键值对 - 若
obj1中不存在某键,则保留obj2中的该键值对
同时需要支持嵌套对象、数组内对象的层级合并(参考示例)
示例输入
obj1:
{ "id": "123", "fname": "John", "lname": "Sam", "gender": "F", "address1": { "country": "USA", "city": "San Jose", "pin": null }, "officeDetails": [ { "workLocation": "Home" } ] }
obj2:
{ "id": "123", "fname": "Victor", "lname": "Sam", "age": "11", "gender": "", "address1": { "country": "USA", "pin": 95112 }, "officeDetails": [ { "laptop": "Y", "mouse": "Y" } ] }
预期输出
{ "id": "123", "fname": "Victor", "lname": "Sam", "age": "11", "gender": "", "address1": { "country": "USA", "city": "San Jose", "pin": 95112 }, "officeDetails": [ { "laptop": "Y", "mouse": "Y", "workLocation": "Home" } ] }
实现代码(JavaScript)
以下是递归实现的深合并函数,完全满足需求:
function deepMerge(obj1, obj2) { // 非对象类型直接返回obj2(优先级更高) if (typeof obj1 !== 'object' || obj1 === null) return obj2; if (typeof obj2 !== 'object' || obj2 === null) return obj2; // 处理数组:按索引合并对应位置的元素 if (Array.isArray(obj1) && Array.isArray(obj2)) { const mergedArr = [...obj2]; obj1.forEach((item, idx) => { mergedArr[idx] = mergedArr[idx] ? deepMerge(item, mergedArr[idx]) : item; }); return mergedArr; } // 处理普通对象:先复制obj1,再用obj2覆盖/补充 const mergedObj = {...obj1}; for (const key in obj2) { if (obj2.hasOwnProperty(key)) { mergedObj[key] = deepMerge(mergedObj[key], obj2[key]); } } return mergedObj; }
验证代码
将示例输入传入函数,即可得到预期输出:
const obj1 = { /* 示例obj1内容 */ }; const obj2 = { /* 示例obj2内容 */ }; const result = deepMerge(obj1, obj2); console.log(JSON.stringify(result, null, 2));
内容的提问来源于stack exchange,提问作者user7194270
相关产品推荐
相关产品推荐

