如何在JavaScript中不使用外部库比较两个字典对象
如何在不使用外部库的情况下比较JavaScript中的两个字典对象
JavaScript中直接用==或===比较对象时,只会检查引用是否相同,不会对比对象的内容。要实现字典(普通对象)的内容比较,需要自己实现一个递归比较函数,核心要覆盖以下几个场景:
- 基础类型的直接比较
- 对象引用的快速判断
- 键集合的一致性检查
- 嵌套对象的递归比较
- 特殊对象类型(日期、正则、数组)的差异化处理
完整实现函数
function compareObjects(obj1, obj2) { // 同一引用直接判定相等 if (obj1 === obj2) return true; // 处理null/undefined的边界情况 if (obj1 === null || obj2 === null) return obj1 === obj2; // 类型不一致直接返回不等 if (typeof obj1 !== 'object' || typeof obj2 !== 'object') return obj1 === obj2; // 区分数组和普通对象(数组属于特殊对象,若需要严格区分则保留此判断) if (Array.isArray(obj1) !== Array.isArray(obj2)) return false; // 处理日期对象:比较时间戳 if (obj1 instanceof Date && obj2 instanceof Date) { return obj1.getTime() === obj2.getTime(); } // 处理正则表达式:比较字符串形式(包含模式和修饰符) if (obj1 instanceof RegExp && obj2 instanceof RegExp) { return obj1.toString() === obj2.toString(); } // 获取对象的键数组,先比较键的数量 const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; // 遍历所有键,递归检查对应值是否相等 for (const key of keys1) { if (!keys2.includes(key) || !compareObjects(obj1[key], obj2[key])) { return false; } } return true; }
使用示例
// 平面对象比较(键顺序不影响结果) const obj1 = { username: 'jdoe', active: true, score: 95 }; const obj2 = { score: 95, username: 'jdoe', active: true }; console.log(compareObjects(obj1, obj2)); // 输出: true // 嵌套对象比较 const nestedObj1 = { profile: { name: 'Alice', preferences: { theme: 'dark' } } }; const nestedObj2 = { profile: { name: 'Alice', preferences: { theme: 'dark' } } }; console.log(compareObjects(nestedObj1, nestedObj2)); // 输出: true // 特殊类型比较 const dateA = new Date('2024-05-20'); const dateB = new Date('2024-05-20'); console.log(compareObjects(dateA, dateB)); // 输出: true // 不相等的情况 const obj3 = { username: 'jdoe', score: 90 }; console.log(compareObjects(obj1, obj3)); // 输出: false
注意事项
- 函数中默认会区分数组和普通对象,如果不需要这种区分(比如把
[1,2]和{0:1,1:2}视为相等),可以删除数组判断的代码。 - 对象中的函数属性会按引用比较,只有同一函数实例才会被判定为相等。
- 对于Map、Set等复杂集合类型,需要额外添加对应的判断逻辑(比如比较size和遍历元素)。
内容的提问来源于stack exchange,提问作者Abhinav Jha
相关产品推荐
相关产品推荐

