数组去重方法

✅ 一、最简单(推荐首选)

👉 使用 Set(ES6)

复制代码
const arr = [1, 2, 2, 3, 4, 4];

const result = [...new Set(arr)];

console.log(result); // [1, 2, 3, 4]

✔ 优点:

  • 写法最简洁

  • 性能好(接近 O(n))

✔ 缺点:

  • 无法处理对象去重(引用不同)

✅ 二、使用 filter

复制代码
const arr = [1, 2, 2, 3, 4, 4];

const result = arr.filter((item, index) => {
  return arr.indexOf(item) === index;
});

console.log(result);

✔ 原理:

  • 只保留第一次出现的位置

❗ 缺点:

  • 性能较差(O(n²))

✅ 三、使用 reduce

复制代码
const arr = [1, 2, 2, 3, 4, 4];

const result = arr.reduce((acc, cur) => {
  if (!acc.includes(cur)) {
    acc.push(cur);
  }
  return acc;
}, []);

console.log(result);

✔ 适合理解函数式编程


✅ 四、使用 Map(推荐处理复杂数据)

复制代码
const arr = [1, 2, 2, 3, 4, 4];

const map = new Map();
const result = [];

arr.forEach(item => {
  if (!map.has(item)) {
    map.set(item, true);
    result.push(item);
  }
});

console.log(result);

✔ 优点:

  • 性能好

  • 可扩展(对象去重)


🚀 五、对象数组去重(面试重点🔥)

👉 按某个字段去重

复制代码
const arr = [
  { id: 1, name: 'a' },
  { id: 1, name: 'b' },
  { id: 2, name: 'c' }
];

const map = new Map();

const result = arr.filter(item => {
  if (!map.has(item.id)) {
    map.set(item.id, true);
    return true;
  }
  return false;
});

console.log(result);

🧠 六、终极通用写法(封装函数)

复制代码
function unique(arr, key) {
  const map = new Map();

  return arr.filter(item => {
    const value = key ? item[key] : item;

    if (!map.has(value)) {
      map.set(value, true);
      return true;
    }
    return false;
  });
}

使用👇

复制代码
unique([1, 2, 2, 3]); 
unique([{id:1},{id:1}], 'id');

⚠️ 七、面试加分点(必须知道)

1️⃣ Set 去重不了对象

复制代码
[{a:1}, {a:1}] // ❌ 还是两个

原因:

👉 引用地址不同


2️⃣ 性能排序(面试常问)

方法 时间复杂度
Set ⭐ O(n)
Map ⭐ O(n)
filter ❌ O(n²)
includes ❌ O(n²)

3️⃣ 特殊值问题

复制代码
NaN === NaN // false

👉 但:

复制代码
new Set([NaN, NaN]) // ✅ 只保留一个

✍️ 总结一句话

👉 简单数据用 Set,复杂数据用 Map,面试优先讲这两个

相关推荐
三*一20 分钟前
优化修整算法
前端·javascript·算法
达子66641 分钟前
RUST 图解 第 3 章:通用编程概念(Common Programming Concepts)
开发语言·算法·rust
道尔柯南1 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
楠楠子呀1 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具
tachibana21 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
weifont2 小时前
自动化抓取和上架商品:能不动手,就少动手
运维·前端·自动化
米柆2 小时前
HTML5 audio /video 完整事件监听模板
前端·html·html5
半个落月2 小时前
LangGraph.js 实战:从状态图到分支、循环、检查点与人工中断
javascript·人工智能·langchain
临床数据科学和人工智能兴趣组2 小时前
正则表达式的基础语法的基本符号
开发语言·人工智能·python·正则表达式·r语言·r语言-4.2.1·workbudyy
王中阳Go2 小时前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型