### 方法一:使用 `Set` 数据结构去重
ES6 中引入了 `Set` 数据结构,它是一种集合,不允许重复值。利用 `Set` 可以非常方便地去除数组中的重复元素。例如:
```javascript
let oldArray = [1, 2, 3, 4, 4];
let newArray = [...new Set(oldArray)];
console.log(newArray); // [1, 2, 3, 4]
```
此方法也适用于字符串去重:
```javascript
let oldStr = 'ababbc';
let newStr = [...new Set(oldStr)].join('');
console.log(newStr); // "abc"
```
使用 `Set` 去重的优势在于代码简洁且性能较好,尤其是在处理大量数据时,效率较高[^2]。
---
### 方法二:结合 `Array.from()` 与 `Set` 去重
除了使用展开运算符 `[...]`,还可以通过 `Array.from()` 方法将 `Set` 转换为数组:
```javascript
let list = [1, 2, 3, 4, 5, 2, 499, 155, 66, 72, 666, 5, 2, 5, 6, 5, 55, 15, 56, 24, 5, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2];
let set = new Set(list);
let newList = Array.from(set);
console.log(newList); // [1, 2, 3, 4, 5, 499, 155, 66, 72, 666, 6, 55, 15, 56, 24]
```
此方法与 `[...]` 类似,但 `Array.from()` 提供了更多的灵活性,比如可以传入映射函数来进一步处理元素[^4]。
---
### 方法三:使用 `filter()` 和 `indexOf()` 去重
在某些情况下,可能需要兼容不支持 `Set` 的环境,或者希望手动实现去重逻辑。可以通过 `filter()` 和 `indexOf()` 实现:
```javascript
let arr = [1, 2, 2, 3, 4, 4, 5];
let narr2 = [];
arr.forEach((item) => {
if (narr2.indexOf(item) === -1) {
narr2.push(item);
}
});
console.log(narr2); // [1, 2, 3, 4, 5]
```
该方法通过遍历数组并检查新数组中是否已存在当前元素,若不存在则添加。虽然代码略显冗长,但在某些特定场景下仍然有效[^3]。
---
### 方法四:复杂数据结构去重
对于包含对象、数组等复杂数据类型的数组,可以结合 `JSON.stringify()` 和 `Set` 实现去重:
```javascript
let list = [1, 2, 2, "kerwin", "kerwin", [1, 23, [3.4], [1, 2], 3, { name: "kerwin" }, { age: 100 }, { name: "kerwin" }], undefined, undefined, NaN, NaN];
function uni(arr) {
let res = new Set();
return arr.filter(item => {
let id = JSON.stringify(item);
if (res.has(id)) {
return false;
} else {
res.add(id);
return true;
}
});
}
console.log(uni(list));
```
此方法通过将每个元素序列化为字符串,确保对象和数组的深层结构也能被正确识别并去重[^4]。
---
### 总结
- **简单数组去重**:推荐使用 `Set` 或 `[...new Set(array)]`。
- **复杂数组去重**:可结合 `JSON.stringify()` 和 `Set`。
- **兼容性考虑**:在不支持 `Set` 的环境中,可以使用 `filter()` 和 `indexOf()`。
每种方法都有其适用场景,开发者可根据具体需求选择最合适的实现方式。
---