如何不依赖第三方库获取两个JavaScript对象的差异内容
实现代码
// 深度相等判断工具函数 function deepEqual(a, b) { if (typeof a !== typeof b) return false; // 原始类型、null、undefined直接判等 if (typeof a !== 'object' || a === null || b === null) return a === b; const keysA = Object.keys(a); const keysB = Object.keys(b); // 键数量不一致直接不相等 if (keysA.length !== keysB.length) return false; // 递归对比所有属性 for (const key of keysA) { if (!keysB.includes(key) || !deepEqual(a[key], b[key])) return false; } return true; } // 求对象差集主函数:返回o1中不在o2完全匹配范围内的顶级键值对 function getObjectDiff(o1, o2) { const diffResult = {}; for (const topKey of Object.keys(o1)) { // 仅当o2存在该顶级键、且值深度完全相等时才剔除,否则保留 if (!o2.hasOwnProperty(topKey) || !deepEqual(o1[topKey], o2[topKey])) { diffResult[topKey] = o1[topKey]; } } return diffResult; }
测试用例
const o1 = { "someProperty": "someValue", "anotherProperty": { "p1": "v1", "p2": "v2" } } const o2 = { "anotherProperty": { "p1": "v1", "p2": "v2" } } const diff = getObjectDiff(o1, o2); console.log(diff); // 输出 {someProperty: "someValue"},完全符合预期
特性说明
- 纯函数实现,不会修改原始o1、o2对象
- 支持任意深度嵌套对象对比,适配多层嵌套、值为原始类型的场景
- 无任何第三方依赖,可直接在所有ES6+兼容的JavaScript环境中运行
- 严格遵循顶级键匹配规则:只有o1的顶级键在o2中存在,且对应值深度完全相等时才会被排除,其余场景均保留o1的对应键值对
内容的提问来源于stack exchange,提问作者user753531
相关产品推荐
相关产品推荐

