文章參考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277
題目
對下列數組去重:
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
要求考慮兼容性和效率
方法一
function unique(arr){
var result = [];
for (var i = 0;i<arr.length;i++){
//如果當前數組的第i項已經保存進了臨時數組,忽略掉
//否則的話把當前項push到臨時數組里面
if(result.indexOf(arr[i]) < 0) result.push(arr[i]);
//indexOf 返回元素在result中的位置,如果沒有返回-1;
}
return result;
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));
總結:兩個問題:1.加上indexOf()相當於加載兩次循環
2.indexOf()在ie9以下不兼容
方法二
function unique(arr){
var result = [];
var hash = {};
for ( var i=0;i<arr.length;i++){
var key = (typeof arr[i]) + arr[i];
if(!hash[key]){
result.push(arr[i]);
hash[key] = true;
}
}
return result;
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));
通過hash表,把已經出現過的元素通過下標的形式存入一個object內。下標的引用比indexOf搜索數組快的多。
方法三
function unique(arr){
var n = [this[0]]; //結果數組
for(var i =1;i<this.length;i++){ //從第二項開始遍歷
//如果當前數組的第i項在當前數組中第一次出現的位置不是i
//那么表示第i項是重復的,忽略掉。否則存入結果數組
if(this.indexOf(this[i]) == i) n.push(this[i]);
}
return n;
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));
方法四
function unique(arr){
this.sort();
var re = [this[0]];
for (var i =1;i<this.length;i++){
if( this[i] != re[re,length-1] ){
re.push(this[i]);
}
}
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));
先把數組排序,然后比較相鄰的兩個值。
方法五
//去重(ES6 Set)
function unique2(array){
return Array.from(new Set(array));
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));
ES6 新方法 form,所以兼容性有問題。
