数组去重方法

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

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

相关推荐
Larcher16 小时前
React Router 不只是页面跳转:从 SPA 路由到权限守卫的完整实践
javascript·后端
Larcher16 小时前
大模型为什么每次回答都不一样?一文搞懂 Temperature、Top K 与 Top P
javascript·后端
名字还没想好☜18 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
用户9385156350719 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
CodeSheep19 小时前
稚晖君公司人事大变动,来了!
前端·后端·程序员
鱼樱前端19 小时前
用 AI 做内容变收入
前端·人工智能·ai编程
eric-sjq19 小时前
10 分钟实战:用 0.6B 本地模型生成中文网页(WanlyFrontend + 编译器全流程)
javascript·机器学习·自然语言处理·html
浮生望20 小时前
React + TypeScript 组件设计进阶:从类型约束到无状态组件的三次进化
前端
To_OC20 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
90后的晨仔20 小时前
Mac 开发 uni-app 终极方案:让安卓模拟器彻底脱离 Android Studio 独立运行
前端·vue.js