寻求快速获取两个对象差异的高效代码实现方案
高效获取对象差异(删除属性标记为"deleted")
需求说明
频繁执行对象差异对比,需输出符合以下规则的结果:
- 对象2中新增或修改的属性值直接保留
- 对象1存在但对象2不存在的属性,标记为
"deleted" - 嵌套对象递归处理,数组视为整体(若对象2中无对应数组属性,直接标记为
"deleted")
高效实现代码
function getObjectDiff(obj1, obj2) { const diff = {}; // 处理obj1属性:标记删除、对比修改/嵌套对象 for (const key in obj1) { if (!obj2.hasOwnProperty(key)) { diff[key] = 'deleted'; } else { const val1 = obj1[key]; const val2 = obj2[key]; // 仅递归处理非数组的嵌套对象 if (typeof val1 === 'object' && val1 !== null && !Array.isArray(val1) && typeof val2 === 'object' && val2 !== null && !Array.isArray(val2)) { const nestedDiff = getObjectDiff(val1, val2); if (Object.keys(nestedDiff).length > 0) { diff[key] = nestedDiff; } } else if (val1 !== val2) { diff[key] = val2; } } } // 处理obj2新增属性 for (const key in obj2) { if (!obj1.hasOwnProperty(key)) { diff[key] = obj2[key]; } } return diff; }
代码高效性说明
- 用
hasOwnProperty直接判断属性归属,避免遍历原型链 - 递归仅针对非数组嵌套对象,减少递归层级开销
- 仅当嵌套对象存在差异时才加入结果,避免生成无意义的空对象
- 分两次循环处理不同场景,逻辑清晰且执行效率高
示例验证
const obj1 = {a: "hi", b: "hi", c: {o: "hi", p: "hi"}, d: ["hi", "bye"]}; const obj2 = {a: "hi", b: "bye", c: {o: "bye"}, e: "new"}; const result = getObjectDiff(obj1, obj2); console.log(result); // 输出:{b: "bye", c: {o: "bye", p: "deleted"}, d: "deleted", e: "new"}
内容的提问来源于stack exchange,提问作者hmmmm
相关产品推荐
相关产品推荐

