JavaScript怎么比较两个数组是否相同

JavaScript怎么比较两个数组是否相同?

在 JavaScript 中,直接比较两个数组是否相同(内容完全相同)需要特别处理,因为数组是引用类型,直接使用 ===== 会比较内存地址而非内容。以下是几种常用方法:


方法 1:JSON.stringify()

将数组转为字符串后比较(适用于简单数据类型顺序一致的数组):

const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];

console.log(JSON.stringify(arr1) === JSON.stringify(arr2)); // true

局限性

  • 不适用于含对象、函数、undefined 等复杂类型的数组。
  • 顺序不同会返回 false(例如 [1, 2][2, 1])。

方法 2:遍历比较

手动遍历数组,逐个比较元素(适用于所有类型):

function areArraysEqual(arr1, arr2) {
  if (arr1.length !== arr2.length) return false;
  for (let i = 0; i < arr1.length; i++) {
    if (arr1[i] !== arr2[i]) return false;
  }
  return true;
}

console.log(areArraysEqual([1, 2], [1, 2])); // true

局限性

  • 若元素是对象或嵌套数组,需递归比较(见方法 3)。

方法 3:深度比较

递归比较所有元素(支持嵌套数组和对象):

function deepEqual(a, b) {
  if (a === b) return true;
  if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;
  if (Array.isArray(a) && Array.isArray(b)) {
    if (a.length !== b.length) return false;
    for (let i = 0; i < a.length; i++) {
      if (!deepEqual(a[i], b[i])) return false;
    }
    return true;
  }
  return false;
}

console.log(deepEqual([1, [2]], [1, [2]])); // true

方法 4:使用 every 和索引

结合 every 方法简化遍历:

const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];

const isEqual = arr1.length === arr2.length && 
                arr1.every((value, index) => value === arr2[index]);

console.log(isEqual); // true

特殊情况处理

  1. NaN 值

    const arr1 = [NaN];
    const arr2 = [NaN];
    const isEqual = arr1.length === arr2.length && 
                   arr1.every((v, i) => (Number.isNaN(v) && Number.isNaN(arr2[i])) || v === arr2[i]);
    console.log(isEqual); // true
  2. 顺序无关的比较
    若顺序不重要,但内容要一致,可先排序再比较:

    const arr1 = [2, 1];
    const arr2 = [1, 2];
    const isEqual = JSON.stringify(arr1.sort()) === JSON.stringify(arr2.sort());
    console.log(isEqual); // true

推荐工具库

对于复杂场景,可以使用第三方库(如 Lodash)的 _.isEqual

const _ = require('lodash');
console.log(_.isEqual([1, { a: 2 }], [1, { a: 2 }])); // true

根据需求选择合适的方法!如果数组结构简单,直接用 JSON.stringify 或遍历;若涉及嵌套或对象,用深度比较或 Lodash。

Leave a Comment

豫ICP备19001387号-1