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

TypeScript中如何判断两个含不同类型元素的数组是否相等?

TypeScript中判断数组内容是否相同的解决方法

问题原因

在JavaScript/TypeScript里,数组属于引用类型,===运算符比较的是变量指向的内存地址,而不是数组里的实际内容。哪怕两个数组元素完全一致,它们也是内存中两个独立的对象,所以props === propsCopied会返回false,导致你的if判断不生效。

解决方法

方法1:用JSON.stringify快速比较(适合元素为基本类型的场景)

如果数组里的元素都是字符串、布尔值这类基本类型,可以把两个数组转成JSON字符串后再比较:

let props:(string|boolean)[]=['abc','def',true,false,'xyz']
let propsCopied:(string|boolean)[]=['abc','def',true,false,'xyz']
let allPropsCopied:boolean;

if(JSON.stringify(props) === JSON.stringify(propsCopied)){
  allPropsCopied=true;
}

注意:这种方法有局限性——元素顺序不同会被判定为不同数组;如果数组里包含函数、undefined或者循环引用,JSON.stringify会处理出错或忽略这些元素。

方法2:自定义数组比较函数(灵活可控)

自己写一个函数,先比较数组长度,再逐个遍历元素对比,适合需要自定义比较逻辑的场景:

// 适用于元素为基本类型的数组
function arraysAreEqual<T>(arr1: T[], arr2: T[]): boolean {
  // 长度不一样直接返回false
  if (arr1.length !== arr2.length) return false;
  // 遍历每个元素逐一比较
  for (let i = 0; i < arr1.length; i++) {
    if (arr1[i] !== arr2[i]) return false;
  }
  return true;
}

// 使用示例
let props:(string|boolean)[]=['abc','def',true,false,'xyz']
let propsCopied:(string|boolean)[]=['abc','def',true,false,'xyz']
let allPropsCopied = arraysAreEqual(props, propsCopied); // 结果为true

如果数组里包含嵌套数组或对象,可以把函数改成递归版本,支持深度比较:

// 支持嵌套数组和对象的深度比较
function arraysAreEqual<T>(arr1: T[], arr2: T[]): boolean {
  if (arr1.length !== arr2.length) return false;
  
  for (let i = 0; i < arr1.length; i++) {
    const item1 = arr1[i];
    const item2 = arr2[i];

    // 嵌套数组递归比较
    if (Array.isArray(item1) && Array.isArray(item2)) {
      if (!arraysAreEqual(item1, item2)) return false;
    } 
    // 对象类型(排除null)递归比较
    else if (typeof item1 === 'object' && item1 !== null && typeof item2 === 'object' && item2 !== null) {
      if (!objectsAreEqual(item1, item2)) return false;
    } 
    // 基本类型直接比较
    else if (item1 !== item2) {
      return false;
    }
  }
  return true;
}

// 对象比较辅助函数
function objectsAreEqual(obj1: object, obj2: object): boolean {
  const keys1 = Object.keys(obj1);
  const keys2 = Object.keys(obj2);
  
  if (keys1.length !== keys2.length) return false;
  
  for (const key of keys1) {
    const val1 = (obj1 as any)[key];
    const val2 = (obj2 as any)[key];
    
    if (Array.isArray(val1) && Array.isArray(val2)) {
      if (!arraysAreEqual(val1, val2)) return false;
    } else if (typeof val1 === 'object' && val1 !== null && typeof val2 === 'object' && val2 !== null) {
      if (!objectsAreEqual(val1, val2)) return false;
    } else if (val1 !== val2) {
      return false;
    }
  }
  return true;
}

方法3:用Lodash的_.isEqual(适合项目已引入Lodash的场景)

如果你的项目已经在用Lodash库,可以直接用它的_.isEqual方法,它能自动处理各种类型的深度比较:

import _ from 'lodash';

let props:(string|boolean)[]=['abc','def',true,false,'xyz']
let propsCopied:(string|boolean)[]=['abc','def',true,false,'xyz']
let allPropsCopied = _.isEqual(props, propsCopied); // 结果为true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:35:38