数组去重的方法有很多,到底哪种是最理想的,自己不清楚。于是自己测试了下数组去重的效果和性能。测试十万个数据,代码和所耗大概时间如下。 到底采用哪种方法,根据实际情况而定吧。 /*方法一: 1,'1' 会被认为是相同的; 所有hash对象,如:{x;1},{y:1}会被认为是相同的 //10ms */ Array.prototype.unique=function(){ var newArr=[],obj={}; for(var i=0,len=this.length;i<len;i++){ if(!obj[this[i]]){ newArr.push(this 在JavaScript中,数组去重是一项常见的操作,尤其在处理大量数据时显得尤为重要。本文将介绍三种常见的JavaScript数组去重方法,并结合代码实例分析其效果和性能。 ### 方法一:使用对象哈希表(Hash Table) 这种方法是通过创建一个空对象`obj`作为哈希表,遍历数组,将元素作为键存入对象。由于JavaScript对象的键是唯一的,因此重复的元素将被忽略。这种方法简单快捷,但在某些情况下可能不准确,例如`1`和`'1'`会被认为相同,以及所有具有相同属性值的对象也会被视为相同。 ```javascript // 基本版本 Array.prototype.unique = function() { var newArr = [], obj = {}; for (var i = 0, len = this.length; i < len; i++) { if (!obj[this[i]]) { newArr.push(this[i]); obj[this[i]] = true; } } return newArr; } ``` 为了处理类型不同的对象,可以改进此方法,将元素的类型与值拼接作为键,以区分`{x:1}`和`{y:1}`这样的对象: ```javascript // 改进版本 Array.prototype.unique = function() { var newArr = [], obj = {}; for (var i = 0, len = this.length; i < len; i++) { if (!obj[typeof(this[i]) + this[i]]) { newArr.push(this[i]); obj[typeof(this[i]) + this[i]] = this[i]; } } return newArr; } ``` ### 方法二:双层循环比较 这种方法通过两层循环实现,外层遍历数组,内层从当前元素后开始比较,如果找到相同的元素,则删除。这种方法去重效果最好,但由于嵌套循环,性能较低。 ```javascript // 双层循环比较 Array.prototype.unique = function() { var newArr = this.concat(); for (var i = 0, len = newArr.length; i < len; i++) { for (var j = i + 1, len2 = newArr.length; j < len2; j++) { if (newArr[i] === newArr[j]) { newArr.splice(j, 1); j--; } } } return newArr; } ``` ### 方法三:使用`indexOf`方法 `indexOf`方法可以查找元素在数组中的索引,如果返回值为-1,则表示元素不在数组中,可以用于去重。这种方法不适用于含有自定义对象的情况,因为对象的相等性是基于引用,而不是值。 ```javascript // 使用indexOf Array.prototype.unique = function() { var newArr = []; for (var i = 0, len = this.length; i < len; i++) { if (newArr.indexOf(this[i]) == -1) { newArr.push(this[i]); } } return newArr; } ``` 性能测试显示,方法一和方法三相对较快,方法二最慢,但去重效果最佳。方法一和方法三无法正确处理复杂对象,而方法二可以。在实际应用中,应根据数据特性和性能需求选择合适的方法。 以下是一个包含多种类型元素的示例数组,用于测试上述去重方法: ```javascript var arr0 = [ // ...(省略内容) ]; ``` 在处理这种复杂数据结构时,可以先尝试用简单的方法一和方法三,如果无法满足需求,再考虑使用方法二进行精确去重。在大型项目中,还需要考虑优化,比如使用`Set`对象(如果兼容性允许)或使用`reduce`函数来实现更高效的去重。
- 粉丝: 2
- 资源: 949
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助