对于arr,arr1可以使用简单的去重方法,但要注意时间复杂度的比较。
对于arr2,可以对里面的数组进行toString(),转化为字符串再比较,不能直接进行数组比较。
对于arr3,判断null时需要注意,null不等于null,所以需增加条件this[i]==this[i],当this[i]!=this[i]时,说明this[i]为null,需另外处理
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js-数组去重</title>
<meta content="http://note.youdao.com/share/index.html?id=55da195bec366816c2093d2e630fb812&type=note#/">
<style></style>
<script>
var tem = new Array("2","3","5","3","4","5");
var arr = ['1a','ni','2','ni','1a','5']; //字符串数组
var arr1 = [1,5,2,3,1,5,9]; //数字数组
var arr2 = [1,5,[1,2],4,9,1,[1,2]]; //包含数组的数组
var arr3 = [1,4,undefined,7,8,null,null]; //包含null的数组
//1. 遍历,数组下标去重法
//时间复杂度:O(n^2),indexOf本身也消耗了O(n)的复杂度,空间复杂度:O(n)
//IE8以下不支持indexOf
Array.prototype.removeRepeat1 = function() {
var res =[this[0]];
for(var i=1; i<this.length;i++){ //从第二项开始遍历
if(this.indexOf(this[i])==i){
res.push(this[i]);
}
}
return res;
};
//2. 遍历,比较备用数组去重法
Array.prototype.removeRepeat2 = function() {
var res =[];
for(var i=0; i<this.length;i++){
if(res.indexOf(this[i])==-1){
res.push(this[i]);
}
}
return res;
};
//3. 遍历,hash去重法
//类似于,利用对象的属性不能相同的特点进行去重
//时间复杂度:O(n),空间复杂度:O(n)
Array.prototype.removeRepeat3 = function() {
var h= {}; //哈希表
var res = [];
for(var i=0; i<this.length;i++){
if(!h[this[i]]){ //如果hash表中没有当前项
h[this[i]]=true; //存入hash表
res.push(this[i]);
}
}
return res;
};
//4. 遍历,Set去重法(ES6的 Set)
//时间复杂度:O(n),空间复杂度:O(n) Set兼容性不好,IE11以下不支持
Array.prototype.removeRepeat4 = function(){
var result = new Set();
for(var i=0; i<this.length; i++){
result.add(this[i]);
}
return result;
}
//Set的方法二:Array.from(array)把Set转化为数组
Array.prototype.removeRepeat41 = function(){
return Array.from(new Set(this));;
}
//5. 排序后相邻去重法
Array.prototype.removeRepeat5 = function() {
this.sort();
var res=[this[0]];
for(var i = 1; i< this.length; i++){
if(this[i]!=this[i-1]){
res.push(this[i]);
}
}
return res;
}
var result = arr2.removeRepeat1();
for(var i=0; i< result.length; i++){
console.log(result[i]);
}
/*console.log(result); //set数组直接输出就好,不用遍历*/
/*对于arr2,可以对里面的数组进行toString(),转化为字符串再比较,不能直接进行数组比较。*/
//双重循环做arr2
var arr2 = [1,[1],5,[1,2],4,9,1,[1,2],[1]]; //包含数组的数组
//先toString()在比较,注意不能使用全等,数组全等要求地址也相同的
Array.prototype.unique = function() {
var res=[];
for(var i=0;i<this.length;i++){
var flag = false;
for(var j=0;j<res.length;j++){
if(this[i].toString()==res[j].toString() && (typeof this[i])==(typeof res[j])){
flag = true;
}
}
if(!flag){
res.push(this[i]);
}
}
return res;
};
/*对于arr3,判断null时需要注意,null不等于null,所以需增加条件this[i]==this[i],当this[i]!=this[i]时,说明this[i]为null,需另外处理*/
//全等
var arr3 = [1,4,undefined,7,8,null,null]; //包含null的数组
Array.prototype.unique = function() {
var res=[];
for(var i=0;i<this.length;i++){
var flag = false;
for(var j=0;j<res.length;j++){
if(this[i]===res[j]){
flag = true;
}
}
if(!flag){
res.push(this[i]);
}
}
return res;
};
var result = arr3.unique();
for(var i=0; i< result.length; i++){
console.log(result[i]);
}
</script>
</head>
<body>
</body>
</html>