You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何找出两个JS对象的属性差异(含缺失属性)

问题分析与解决方案

你的问题出在依赖对象键的索引位置进行对比——JavaScript对象的键顺序不能被可靠地用来匹配两个对象的属性!原代码通过获取两个对象的keys数组,然后按最长数组的索引循环,把obj1Keys[i]和obj2Keys[i]对应起来对比值,这完全是错误的逻辑,因为两个对象的键在数组中的位置可能完全不对应(比如第一个示例里test在obj1的keys数组第3位,而obj2的第3位是example,导致你错误地把这两个属性的值做了对比)。


正确的实现思路

要找出两个对象的差异,我们需要:

  1. 收集所有存在于两个对象中的唯一属性名(不管只在一个对象里还是两个都有)
  2. 遍历每个属性名,分别从两个对象中取出对应的值
  3. 只要两个值不相等(或者一个存在一个不存在),就输出该属性的信息

代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:00:16