三种方法:
Array.prototype.unique1 = function(){
var arr = [];//临时数组
for(var i = 0;i < this.length;i++){
//如果当前数组的第i已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if(arr.indexOf(this[i] == -1))
arr.push(this[i]);
}
return arr;
}
Array.prototype.unique2 = function(){
var n = {}, arr = [];//n是哈希表,arr是临时数组
for(var i = 0;i< this.length;i++){
if(!n(this[i])){//如果hash表中没有当前项
n[this[i]] = true;//把记录存入hash表
arr.push(this[i]);//把当前数组的当前项push到临时数组里面
}
}
return arr;
}
Array.prototype.unique3 = function(){
var arr = [this[0]];//结果数组
for(var i = 1;i<this.length;i++){//从第二项开始遍历
//如果当前数组的第i项在当前数组中第一次出现的位置不是i,
//那么表示第i项是重复的,忽略掉。否则存入结果数组
if(this.indexOf(this[i]) == i)
arr.push(this[i]);
}
return arr;
}
其中第1种和第3种方法都用到了数组的indexOf方法。此方法的目的是寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所以此函数会浪费掉很多时间。 而第2中方法用的是hash表。把已经出现过的通过下标的形式存入一个object内。下标的引用要比用indexOf搜索数组快的多。
第二种方法远远快于其他两种方法。 但是内存占用方面应该第二种方法比较多,因为多了一个hash表。这就是所谓的空间换时间。