JavaScript数组去重的6个方法
需积分: 0 86 浏览量
更新于2020-11-30
收藏 64KB PDF 举报
方法一
无需思考,我们可以得到 O(n^2) 复杂度的解法。定义一个变量数组 res 保存结果,遍历需要去重的数组,如果该元素已经存在在 res 中了,则说明是重复的元素,如果没有,则放入 res 中。
function unique(a) {
var res = [];
for (var i = 0, len = a.length; i < len; i++) {
var item = a[i];
for (var j = 0, jLen = res.length; j < jLen; j++) {
if (res[j] === item)
break;
}
if (j
JavaScript数组去重是一个常见的编程问题,特别是在处理数据集合时。以下将详细讲解6种不同的方法来实现JavaScript数组去重,并分析其效率和适用场景。
**方法一:双重循环检查**
这是最直观的方法,通过外层循环遍历数组,内层循环检查当前元素是否已存在于结果数组中。这种方法的时间复杂度为O(n^2),效率较低,但实现简单。
```javascript
function unique(a) {
var res = [];
for (var i = 0, len = a.length; i < len; i++) {
var item = a[i];
for (var j = 0, jLen = res.length; j < jLen; j++) {
if (res[j] === item) break;
}
if (j === jLen) res.push(item);
}
return res;
}
```
**方法二:利用`indexOf`**
ES5引入的`Array.prototype.indexOf`方法可以用来查找元素在数组中的索引,若不存在则返回-1。通过检查索引是否为-1来决定是否添加元素到结果数组,简化了代码,但时间复杂度依然是O(n^2)。
```javascript
function unique(a) {
var res = [];
for (var i = 0, len = a.length; i < len; i++) {
var item = a[i];
(res.indexOf(item) === -1) && res.push(item);
}
return res;
}
```
**方法三:结合`sort`和`filter`**
对数组进行排序后,相同元素会相邻,然后通过`filter`检查相邻元素是否相同。但这不适用于包含字符串或对象的情况,因为字符串'1'和数字1在排序后会被视为相等。
```javascript
function unique(a) {
return a.concat().sort().filter(function(item, pos, ary) {
return !pos || item != ary[pos - 1];
});
}
```
**方法四:使用`Object`作为哈希表**
创建一个空对象,用数组元素作为键,值无所谓。如果元素已存在,说明是重复的,否则将其添加到结果数组。这种方法效率较高,时间复杂度为O(n),但不适用于不可哈希的元素(如对象)。
```javascript
function unique(a) {
var obj = {};
var res = [];
for (var i = 0, len = a.length; i < len; i++) {
var item = a[i];
if (!obj[item]) {
obj[item] = true;
res.push(item);
}
}
return res;
}
```
**方法五:使用`Set`**
ES6引入的`Set`数据结构具有自动去重功能,可以方便地实现数组去重,但不是所有环境都支持。
```javascript
function unique(a) {
return [...new Set(a)];
}
```
**方法六:使用`reduce`**
`reduce`函数可以将数组折叠成一个单一的值,这里我们可以将结果积累在一个数组中,同时检查元素是否已存在。
```javascript
function unique(a) {
return a.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
}
```
每种方法都有其优缺点,实际应用中应根据数组内容、性能需求以及浏览器/运行环境的兼容性来选择合适的方法。例如,对于大型数据集,优先考虑使用哈希表(方法四)或`Set`(方法五),而对于小规模数据和兼容性要求不高的情况,其他方法也是可行的。
weixin_38705762
- 粉丝: 6
- 资源: 905
最新资源
- 易优CMS响应式模板PHP+Mysql+E000673职业教育培训机构网站模板.zip
- 淘系对账实操课程详解:从订单处理到绩效工资核算,全面掌握电商财务管理.mp4
- Linux-C编程一站式学习-最新版
- 2021新版散热器风扇马达组装生产线(sw20可编辑+工程图)全套技术资料100%好用.zip
- KR C5 控制柜安装指南中文说明书
- 玩转小红书电商:从选品到上架,再到笔记发布与流量获取,一站式指南.mp4
- 突破销售瓶颈,掌握销冠三火轮,实现业绩持续增长的销售技能课.mp4
- 详细教你自媒体视频二剪搬运技术,自己加工100%过原创,无脑搬运.mp4
- Kaggle实战之Rossmann商店销售预测数据
- Muse-Ant-Desgin-Vue 改造成vue3的代码
- 小红书电商项目全解析,包括账号搭建、店铺运营、笔记发布 实现流量变现.mp4
- 小红书电商引流教程:从基础操作到发布内容,引流技巧,轻松打造爆款产品.mp4
- 前端开发领域中JavaScript语言的基础理论与实战指南
- RTA-OS3.1-Reference-Guide
- linux下的webstorm的deb安装包002
- 小红书实战训练营:精准定位用户,传授六个技巧,助你写出爆款笔记.mp4