可以使用通过对象键进行迭代的递归函数。然后使用Object.is测试
NaN和
null。然后测试如果第二对象是流延到该类型
false喜欢
0,
NaN或
null。列出两个对象的键并将它们连接起来以测试中缺少的键
obj1,然后对其进行迭代。
当相同的键值之间存在差异时,它将存储的值
object2并继续。如果两个键值都是对象,则意味着可以递归比较,因此也是如此。
function diff(obj1, obj2) { const result = {}; if (Object.is(obj1, obj2)) { return undefined; } if (!obj2 || typeof obj2 !== 'object') { return obj2; } Object.keys(obj1 || {}).concat(Object.keys(obj2 || {})).forEach(key => { if(obj2[key] !== obj1[key] && !Object.is(obj1[key], obj2[key])) { result[key] = obj2[key]; } if(typeof obj2[key] === 'object' && typeof obj1[key] === 'object') { const value = diff(obj1[key], obj2[key]); if (value !== undefined) { result[key] = value; } } }); return result;}上面的代码是BSD许可的,可以在任何地方使用。
测试链接:https://jsfiddle.net/gartz/vy9zaof2/54/
一个重要的观察,这会将数组转换为对象,并比较相同索引位置的值。 由于需要额外的复杂性,还有许多其他方法可以比较此功能未涵盖的数组。
编辑2/15/2019:已更改此答案以添加新的ES2017语法并修复注释中的用例。
这只是一个开始,我还没有测试过,但是我从一个过滤器或比较器函数开始,它是递归的,但是要获得优先级结果就更改它。
function filter(obj1, obj2) { var result = {}; for(key in obj1) { if(obj2[key] != obj1[key]) result[key] = obj2[key]; if(typeof obj2[key] == 'array' && typeof obj1[key] == 'array') result[key] = arguments.callee(obj1[key], obj2[key]); if(typeof obj2[key] == 'object' && typeof obj1[key] == 'object') result[key] = arguments.callee(obj1[key], obj2[key]); } return result;}测试:http://jsfiddle.net/gartz/Q3BtG/2/



