js数组去重的方法

1️⃣ 使用 Set

最简单直接的方法,适合一维数组基本类型(字符串、数字)。

ts 复制代码
1.  // 1.利用set去重
1.  // Set是es6新增的数据结构,似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合
1.  // Array.from()就是将一个类数组对象或者可遍历对象转换成一个真正的数组,也是ES6的新增方法
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = Array.from(new Set(arr));
// 或者
const uniqueArr2 = [...new Set(arr)];
console.log(uniqueArr); // [1, 2, 3, 4]

✅ 优点:简洁、性能好

⚠️ 缺点:只适合原始类型,如果是对象需要特殊处理。

2️⃣ 使用 filter + indexOf

利用数组的 filter 过滤重复项。

ts 复制代码
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = arr.filter((item, index) => arr.indexOf(item) === index);
console.log(uniqueArr); // [1, 2, 3, 4]

✅ 优点:不依赖 ES6

⚠️ 缺点:indexOf 每次遍历数组,性能比 Set 差。

3️⃣ 使用对象/Map 记录出现过的值

适合大数组 ,性能比 filter + indexOf 好。

ts 复制代码
//map数据结构是es6中新出的语法,其本质也是键值对,只是其键不局限于普通对象的字符串
const arr = [1, 2, 2, 3, 3, 4];

//对象去重
const seen: Record<number, boolean> = {};
const uniqueArr = arr.filter(item => {
  if (seen[item]) return false;
  seen[item] = true;
  return true;
});
console.log(uniqueArr); // [1, 2, 3, 4]

//map去重
const seen = new Map<number, boolean>();
const uniqueArr = arr.filter(item => {
  if (seen.has(item)) return false; // 如果已经存在,过滤掉
  seen.set(item, true);             // 记录该值出现过
  return true;                      // 第一次出现的值保留
});

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

✅ 优点:适合大数组

⚠️ 缺点:只适合基本类型(数字、字符串),对象就需要自定义 key。

4️⃣ 使用 reduce

利用 reduce 聚合唯一值。

ts 复制代码
const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = arr.reduce((acc, cur) => {
  if (!acc.includes(cur)) acc.push(cur);
  return acc;
}, [] as number[]);
console.log(uniqueArr); // [1, 2, 3, 4]

✅ 优点:灵活,可用于对象

⚠️ 缺点:数组大时性能不如 Set

5️⃣ 对象数组去重(根据某个属性)

如果数组元素是对象,可以用 MapSet 结合属性值去重。

ts 复制代码
const arr = [
  { id: 1, name: '苹果' },
  { id: 2, name: '苹果' },
  { id: 3, name: '香蕉' },
];

// 根据 name 去重
const uniqueArr = Array.from(new Map(arr.map(item => [item.name, item])).values());
console.log(uniqueArr);
// [{ id: 2, name: '苹果' }, { id: 3, name: '香蕉' }]

✅ 优点:适合对象数组,保留对象结构

⚠️ 缺点:需要选择合适的属性作为 key

6️⃣ Lodash 等库函数

如果项目中有 lodash,可以直接用 _.uniq_.uniqBy

ts 复制代码
import _ from 'lodash';

const arr = [1, 2, 2, 3, 3, 4];
const uniqueArr = _.uniq(arr);

const arrObj = [
  { id: 1, name: '苹果' },
  { id: 2, name: '苹果' }
];
const uniqueArrObj = _.uniqBy(arrObj, 'name');

✅ 优点:代码简洁,功能丰富

⚠️ 需要额外依赖库

💡 总结建议

类型 推荐方法
一维基本类型 Setfilter
大数组基本类型 Map/对象
对象数组 Map + keylodash uniqBy
复杂去重逻辑 reduce
相关推荐
swipe几秒前
RabbitMQ 实战:AI Agent 里异步处理的标配方案(手把手 + 4 种交换机全解析)
后端·面试·langchain
Buke..1 分钟前
【APP 逆向】哔哩哔哩 sign 参数逆向(下):OLLVM 混淆还原 sign 算法
java·javascript·爬虫·python·算法
前端炒粉2 小时前
长会话虚拟滚动与渲染优化
前端·javascript·vue.js
谙忆10242 小时前
图片裁剪总是跑偏?用 object-fit、object-position 和真实像素把坐标对齐
javascript·css·图像识别
花归去2 小时前
ant的a-table更改表格的高度
前端·javascript·html
sibylyue3 小时前
基于 Vben Admin 框架的 Vue 3 前端项目配置文件及常用命令
前端·javascript·vue.js
早点睡9754 小时前
Python 上下文管理器深度剖析:从 with 语法糖到 CPython 底层协议
后端·面试
嵌入式阿蔡4 小时前
面试高频考点 01:volatile / 中断 / 堆栈 八股精讲
java·面试·职场和发展·嵌入式实时数据库
AC赳赳老秦5 小时前
多源数据关联挖掘:OpenClaw 打通工商、招投标、专利公开数据,挖掘企业业务关联关系
java·c语言·javascript·c++·python·deepseek·openclaw
光影少年6 小时前
react navite 内存泄漏:定时器、监听事件、订阅销毁
前端·javascript·react native·react.js·前端框架