如何找出两个JS对象的属性差异(含缺失属性)
问题分析与解决方案
你的问题出在依赖对象键的索引位置进行对比——JavaScript对象的键顺序不能被可靠地用来匹配两个对象的属性!原代码通过获取两个对象的keys数组,然后按最长数组的索引循环,把obj1Keys[i]和obj2Keys[i]对应起来对比值,这完全是错误的逻辑,因为两个对象的键在数组中的位置可能完全不对应(比如第一个示例里test在obj1的keys数组第3位,而obj2的第3位是example,导致你错误地把这两个属性的值做了对比)。
正确的实现思路
要找出两个对象的差异,我们需要:
- 收集所有存在于两个对象中的唯一属性名(不管只在一个对象里还是两个都有)
- 遍历每个属性名,分别从两个对象中取出对应的值
- 只要两个值不相等(或者一个存在一个不存在),就输出该属性的信息
代码实现
function compareObjectProps(objA, objB) { // 合并两个对象的键并去重,得到所有需要检查的属性名 const allProperties = new Set([...Object.keys(objA), ...Object.keys(objB)]); allProperties.forEach(prop => { const valA = objA[prop]; const valB = objB[prop]; // 只要值不相等就输出(包括一个存在一个不存在的情况) if (valA !== valB) { console.log(`property: ${prop}, ${valA},${valB}`); } }); } // 测试第一个示例 const myObj1 = { "name": "John", "age": "45", "car": 20, "test": 30, "example": 20 }; const myObj2 = { "name": "John", "age": "30", "car": 10, "example": 10 }; compareObjectProps(myObj1, myObj2); // 输出结果完全符合预期: // property: age, 45,30 // property: car,20,10 // property: test,30,undefined // property: example,20,10
测试第二个示例
const myObj1 = { "name":"John", "age":"45", "car":20 }; const myObj2 = { "name":"John", "age":"30", "car":10,"test":30 }; compareObjectProps(myObj1, myObj2); // 输出: // property: age, 45,30 // property: car,20,10 // property: test,undefined,30
为什么原代码会出错?
在JavaScript中,对象的键虽然在ES6+有了一定的顺序规则(数字键按升序,字符串键按插入顺序,Symbol键按插入顺序),但绝对不能依赖索引位置来关联两个不同对象的属性。你的原代码假设obj1Keys[i]和obj2Keys[i]是同一个属性名,这在两个对象属性顺序不同时必然出错——比如第一个示例中,obj1的keys数组是["name","age","car","test","example"],obj2的是["name","age","car","example"],当循环到索引3时,obj1取的是test,obj2取的是example,所以错误地把这两个无关属性的值做了对比,导致输出不符合预期。
内容的提问来源于stack exchange,提问作者tata titi
相关产品推荐
相关产品推荐

