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

如何在TypeScript中检查大型对象数组是否存在重复(返回布尔值)

TypeScript检查大型对象数组重复项的最优方法

针对大型对象数组,判断是否存在重复项并返回布尔值的最优方案,核心是尽量提前终止遍历+低开销的重复判断逻辑,分两种常见场景处理:


场景1:基于唯一标识(如id)判断重复

如果你的业务逻辑中,id相同即视为重复项,这种方法性能最优:

function hasDuplicatesById(arr: { id: number, name: string }[]): boolean {
  const seenIds = new Set<number>();
  for (const item of arr) {
    if (seenIds.has(item.id)) {
      return true; // 发现重复立即返回,无需遍历全部
    }
    seenIds.add(item.id);
  }
  return false;
}

// 测试示例
let testArray: { id: number, name: string }[] = [
    { "id": 0, "name": "name1" },
    { "id": 1, "name": "name2" },
    { "id": 2, "name": "name3" },
    { "id": 3, "name": "name4" },
    { "id": 2, "name": "name3" },
    { "id": 2, "name": "name3" }
];
console.log(hasDuplicatesById(testArray)); // 输出 true

优势

  • 时间复杂度O(n),空间复杂度O(n)
  • 一旦找到重复项就终止遍历,避免无意义的后续操作,尤其适合超大型数组

场景2:整个对象完全匹配才视为重复

如果需要判断对象的所有属性都完全相同才算重复,优先用自定义拼接键的方式(比JSON.stringify性能更高):

function hasDuplicateFullObjects(arr: { id: number, name: string }[]): boolean {
  const seenKeys = new Set<string>();
  for (const item of arr) {
    // 用固定格式拼接属性生成唯一键,替代JSON.stringify
    const uniqueKey = `${item.id}-${item.name}`;
    if (seenKeys.has(uniqueKey)) {
      return true;
    }
    seenKeys.add(uniqueKey);
  }
  return false;
}

console.log(hasDuplicateFullObjects(testArray)); // 输出 true

如果对象结构复杂且属性不固定,也可以用JSON.stringify,但注意属性顺序会影响判断结果:

function hasDuplicateFullObjects(arr: { id: number, name: string }[]): boolean {
  const seenKeys = new Set<string>();
  for (const item of arr) {
    const uniqueKey = JSON.stringify(item);
    if (seenKeys.has(uniqueKey)) {
      return true;
    }
    seenKeys.add(uniqueKey);
  }
  return false;
}

优势

  • 同样是提前终止遍历,保证性能
  • 自定义拼接键的方式比JSON.stringify的序列化开销更低,适合大型数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:25:06