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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 07:43:11