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

如何在JavaScript中判断两个对象数组是否相等?

问题原因

在JavaScript中,数组和对象都属于引用类型,===运算符比较的是它们在内存中的引用地址,而非内容:

  • listA和listB是两个独立创建的数组对象,内存地址不同,所以listA === listB返回false。
  • 数组中的每个元素也是独立的对象实例,即使属性值完全一致,element === listB[index]比较的依然是对象的引用地址,因此结果也是false。
解决方案

根据你的需求,提供几种可行的数组内容相等判断方法:

1. 手动比较对象属性(适合结构固定的场景)

因为你的数组元素结构固定(只有id和color两个属性),可以直接在every方法中逐个比较属性值:

const checkArray = () => {
  const isSame = listA.length === listB.length && listA.every((element, index) => {
    const bItem = listB[index];
    return element.id === bItem.id && element.color === bItem.color;
  });
  console.log(isSame); // 输出true
};

2. 使用JSON.stringify(适合简单结构场景)

将数组转换为JSON字符串后比较,适合元素结构简单、没有函数/undefined/循环引用的情况:

const checkArray = () => {
  const isSame = JSON.stringify(listA) === JSON.stringify(listB);
  console.log(isSame); // 输出true
};

⚠️ 注意:如果对象包含函数、undefined、Symbol,或者属性顺序不同(JSON.stringify会保留属性顺序),这种方法可能会得到错误结果。

3. 自定义深度比较函数(适合复杂结构场景)

如果你的数组元素结构可能变化或更复杂,可以写一个递归的深度比较函数,实现任意引用类型的内容比较:

function deepEqual(a, b) {
  // 基本类型或同一引用直接返回true
  if (a === b) return true;
  // 排除非对象或null的情况
  if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {
    return false;
  }
  // 比较键的数量
  const keysA = Object.keys(a);
  const keysB = Object.keys(b);
  if (keysA.length !== keysB.length) return false;
  // 递归比较每个键的值
  for (const key of keysA) {
    if (!keysB.includes(key) || !deepEqual(a[key], b[key])) {
      return false;
    }
  }
  return true;
}

const checkArray = () => {
  const isSame = listA.length === listB.length && listA.every((item, index) => deepEqual(item, listB[index]));
  console.log(isSame); // 输出true
};

内容的提问来源于stack exchange,提问作者Haksatrya Bhaswara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:31:08