# 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方法,它们在性能和代码简洁性方面都有很好的表现。
914

被折叠的 条评论
为什么被折叠?



