递归比较两个Object,输出缺失键与值变更结果
递归比较两个JavaScript对象,提取缺失键与值差异
需求说明:
递归对比两个JavaScript对象obj1和obj2,生成两个输出结果:
output1:包含obj1中存在但obj2缺失的所有键值对(支持嵌套对象)output2:包含两者键名相同但值不同的键值对,保留obj1中的对应值(支持嵌套对象)
示例对象
const obj1 = { "val1": "test", "stream": { "key": true, "value": false }, "val2": "test", "val3": "test" } const obj2 = { "val1": "test", "stream": { "key": false, "value": false } }
期望输出
const output1 = { "val2": "test", "val3": "test" } const output2 = { "stream": { "key": true } }
实现代码
function compareObjects(obj1, obj2) { const output1 = {}; const output2 = {}; // 遍历obj1的所有自身属性 for (const key in obj1) { if (obj1.hasOwnProperty(key)) { const val1 = obj1[key]; const val2 = obj2[key]; // obj2无此键,归入output1 if (!(key in obj2)) { output1[key] = val1; } else { // 判断是否为非null对象,递归处理嵌套结构 const isObj1 = typeof val1 === 'object' && val1 !== null; const isObj2 = typeof val2 === 'object' && val2 !== null; if (isObj1 && isObj2) { const nestedResult = compareObjects(val1, val2); // 递归结果有内容才添加,避免空对象 if (Object.keys(nestedResult.output1).length) { output1[key] = nestedResult.output1; } if (Object.keys(nestedResult.output2).length) { output2[key] = nestedResult.output2; } } else { // 非对象类型直接比较值 if (val1 !== val2) { output2[key] = val1; } } } } } return { output1, output2 }; } // 使用示例 const { output1, output2 } = compareObjects(obj1, obj2); console.log('output1:', output1); console.log('output2:', output2);
代码说明
- 属性遍历:用
for...in配合hasOwnProperty确保只处理对象自身属性,排除原型链属性。 - 缺失键判断:直接检查键是否存在于
obj2,不存在则存入output1。 - 嵌套递归:遇到嵌套对象时递归调用函数,仅当递归结果有有效内容时才添加到输出,避免生成空对象节点。
- 值差异处理:非对象类型直接对比值,不相等时保留
obj1的值存入output2。
内容的提问来源于stack exchange,提问作者Gautham Shetty
相关产品推荐
相关产品推荐

