第一种算法:es6
算法思想:面试
一、构建一个新数组,新数组包含一个元素,元素值为目标数组的一个值;算法
二、从目标数组的第二个元素开始遍历,依次取出每个元素;数组
三、将取出的元素与新数组里面的全部元素进行比较,若是没有出现,则将该元素添加到新数组中,若是出现,则处理下一个目标数组的元素;ide
四、目标数组的全部元素均已处理完。函数
1 Array.prototype.deleteRepeat1=function (){ 2 //构建一个新数组,存放结果,首先给newArray一个初值,初值为调用该函数的数组的第一个值即this[0] 3 var newArray=[this[0]]; 4 //for循环,每次从原数组中取出一个元素 5 //用取出的元素循环与结果数组比较 6 for(var i=1;i<this.length;i++){ 7 // 添加一个标记,用于标记当前元素是否在newArray中出现过 8 var repeat=false; 9 for(var j=0,len=newArray.length;j<len;j++){ 10 //原数组取出的元素与结果数组元素相同 11 if(this[i] == newArray[j]){ 12 repeat=true; 13 break; 14 } 15 } 16 //若是原数组中没有该元素,则存放到结果数组中 17 if(!repeat){ 18 newArray.push(this[i]); 19 } 20 } 21 return newArray; 22 } 23 var array=[1,1,2,2,2,3,3,4,5,6,6,6,6]; 24 array.deleteRepeat();//1,2,3,4,5,6
对上面试算法的改进:this
利用forEach,indexOf方法替代上述的循环和检测:spa
1 Array.prototype.deleteRepeat1=function (){ 2 var newArray=[]; 3 // index是目标数组中的每个元素 4 this.forEach(function(index){ 5 // indexOf方法返回index在newArray中出现的位置,若是没有出现则返回-1 6 if(newArray.indexOf(index) == -1){ 7 newArray.push(index); 8 } 9 }); 10 return newArray; 11 }
可是在IE9+如下并不支持forEach函数;能够重写forEach 函数实现兼容。prototype
第二种算法:code
算法思想:
一、对目标数组进行排序;
二、遍历目标数组,检测数组中的第 i 个元素与结果数组中最后一个元素是否相同,若是不一样,则将该元素添加到结果数组中;
1 Array.prototype.deleteRepeat2=function (){ 2 // 首先对目标数组进行排序 3 this.sort(); 4 var newArray=[]; 5 // index是目标数组中的每个元素 6 for(var i=0,len=this.length;i<len;i++){ 7 // 将this[i]与newArray中的最后一个元素比较,由于已经排过序,相同的元素确定在相同的位置了 8 if(this[i] !== newArray[newArray.length-1]){ 9 newArray.push(this[i]); 10 } 11 } 12 return newArray; 13 }
这种算法的优缺点:
去重后的数组是排过序的,并且没法区分与数字相同的数字字符 好比: “1” 和 1;
第三种算法:
算法思想:
一、建立一个新数组和新对象;
二、遍历目标数组中的每个元素,将该元素与对象进行比对,若是不重复则添加到结果数组中,同时将该元素的值做为对象的属性,并将该属性值设为1;
1 Array.prototype.deleteRepeat2=function (){ 2 var newArray =[]; 3 // 建立一个空对象 4 var object = {}; 5 // 每次取出一个元素,与对象进行比对,若是这个元素不重复,则添加到结果数组中,同时把这个元素的内存做为对象的一个属性并存入对象中 6 for(var i=0,len=this.length;i<len;i++){ 7 if(!object[typeof(this[i]) + this[i]]){ 8 newArray.push(this[i]); 9 object[typeof(this[i]) + this[i]]=1; 10 } 11 } 12 return newArray; 13 }
这种算法的效果最好,速度最快。可是占用内存大。
对这个算法的理解:
这里的对象也能够换成一个数组,每次将不重复的元素做为数组的索引,而后将该索引值设为1,下次再出现时若是array[element]==1;说明此element已经出现过,是重复的。
第四种算法:
算法思想:
一、建立一个新数组保存结果;
二、对目标数组进行排序,将目标数组中的第一个元素存入结果数组中;
三、处理目标数组的第二个元素,若是这个元素和它前面的元素不一样,说明是不重复,则添加到结果数组中。
1 Array.prototype.deleteRepeat3=function (){ 2 var newArray =[this[0]]; 3 this.sort(); 4 for(var i=1;i<this.length;i++){ 5 比较当前元素和前一个元素是否相同,若是重复,排序后,相同的会在一块儿。 6 if(this[i] !== this[i-1]){ 7 newArray.push(this[i]); 8 } 9 } 10 return newArray; 11 }
第五种算法:
算法思想:
一、利用数组的reduce方法,对数组中的每个元素进行处理
1 Array.prototype.deleteRepeat3=function (){ 2 // 经过数组的reduce方法,对数组中的每个元素进行处理,原理都同样,只是使用了不一样的方法 3 return this.reduce(function(newArray,index){ 4 if(newArray.indexOf(index)<0){ 5 newArray.push(index); 6 } 7 return newArray; 8 },[]); 9 }
第六种算法:
算法思想:
一、和上面相同,不过是使用了filter方法
1 Array.prototype.deleteRepeat3=function (){ 2 var newArray=[]; 3 newArray=this.filter(function(ele,i,arr) { 4 return arr.indexOf(ele) === i; 5 }); 6 return newArray; 7 }
第七种算法:
这种是利用ES6去重,相对来讲更为简单
1 //es6 2 function deleteRepeat(arr){ 3 const seen=new Map(){ 4 return arr.filter((a)=>!seen.has(a)&&seen.set(a,1)); 5 } 6 } 7 //or 8 function deleteRepeat2(arr){ 9 return Array.form(new Set(arr)) 10 }