数组去重方法

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

👉 使用 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,面试优先讲这两个

相关推荐
清华都得不到的好学生2 小时前
数据结构->1.稀疏数组,2.数组队列(没有取模),3.环形队列
java·开发语言·数据结构
我命由我123452 小时前
浏览器的 JS 模块化支持观察记录
开发语言·前端·javascript·css·html·ecmascript·html5
软件开发技术深度爱好者2 小时前
用python + pillow实现GUI界面图片GUI处理工具
开发语言·python
weixin_425023002 小时前
PG JSONB 对应 Java 字段 + MyBatis-Plus 完整实战
java·开发语言·mybatis
weixin_443478512 小时前
Flutter第三方常用组件包之路由管理
前端·javascript·flutter
武藤一雄2 小时前
C# 异步回调与等待机制
前端·microsoft·设计模式·微软·c#·.netcore
啥都不懂的小小白3 小时前
前端CSS入门详解
前端·css
leaves falling3 小时前
C++ string 类:从入门到模拟实现
开发语言·c++
智算菩萨3 小时前
【Tkinter】15 样式与主题深度解析:ttk 主题系统、Style 对象与跨平台样式管理实战
开发语言·python·ui·ai编程·tkinter