JavaScript数组去重的5种高效方法

# JavaScript数组去重的5种高效方法

## 1. 使用Set数据结构

Set是ES6引入的新数据结构,它只存储唯一值,自动过滤重复元素。

```javascript

function uniqueWithSet(arr) {

return [...new Set(arr)];

}

// 示例

const arr = [1, 2, 2, 3, 4, 4, 5];

console.log(uniqueWithSet(arr)); // [1, 2, 3, 4, 5]

```

优点:代码简洁,性能优秀

缺点:无法处理对象类型的重复元素

## 2. 使用filter和indexOf方法

利用数组的filter方法结合indexOf来筛选唯一元素。

```javascript

function uniqueWithFilter(arr) {

return arr.filter((item, index) => arr.indexOf(item) === index);

}

// 示例

const arr = ['a', 'b', 'a', 'c', 'b'];

console.log(uniqueWithFilter(arr)); // ['a', 'b', 'c']

```

优点:兼容性好,可读性强

缺点:对于大型数组性能较差

## 3. 使用reduce方法

通过reduce方法构建新数组,检查元素是否已存在。

```javascript

function uniqueWithReduce(arr) {

return arr.reduce((unique, item) => {

return unique.includes(item) ? unique : [...unique, item];

}, []);

}

// 示例

const arr = [1, 1, 2, 3, 3, 4];

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

```

优点:函数式编程风格,灵活性强

缺点:性能中等

## 4. 使用对象属性

利用对象属性名的唯一性来实现去重。

```javascript

function uniqueWithObject(arr) {

const obj = {};

const result = [];

for (let i = 0; i < arr.length; i++) {

const key = typeof arr[i] + JSON.stringify(arr[i]);

if (!obj[key]) {

obj[key] = true;

result.push(arr[i]);

}

}

return result;

}

// 示例

const arr = [1, '1', 2, 2, {a: 1}, {a: 1}];

console.log(uniqueWithObject(arr)); // [1, '1', 2, {a: 1}]

```

优点:可以处理混合数据类型

缺点:代码相对复杂

## 5. 使用Map数据结构

Map可以保持键值对的插入顺序,且键可以是任意类型。

```javascript

function uniqueWithMap(arr) {

const map = new Map();

const result = [];

for (const item of arr) {

if (!map.has(item)) {

map.set(item, true);

result.push(item);

}

}

return result;

}

// 示例

const arr = [1, 2, 2, 3, 4, 4, 5];

console.log(uniqueWithMap(arr)); // [1, 2, 3, 4, 5]

```

优点:性能优秀,保持插入顺序

缺点:ES6+环境支持

## 性能比较

在实际应用中,不同方法的性能表现会有所差异:

- Set方法:通常是最快的,特别适合基本数据类型

- Map方法:性能接近Set,适合需要保持顺序的场景

- 对象属性法:处理复杂数据类型时表现良好

- reduce方法:代码优雅但性能中等

- filter方法:代码简洁但大型数组性能较差

## 总结

选择合适的去重方法需要考虑以下因素:

- 数据类型(基本类型还是对象类型)

- 数据规模

- 运行环境兼容性要求

- 是否需要保持元素顺序

对于现代JavaScript开发,推荐优先使用Set或Map方法,它们在性能和代码简洁性方面都有很好的表现。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值