总结下javascript中常见的数组去重方法,面试中也经常会遇到这个问题。引申的还有合并数组并去重。
方法一:遍历数组
思路:新建一数组,遍历传入数组,若元素不在新数组中就添加到新数组中。
注意:判断值是否在数组的方法“indexOf”是ECMAScript5方法,IE8以下不支持,需多写兼容低版本浏览器代码。
1 //判断浏览器是否支持indexOf方法 2 if(!Array.prototype.indexOf){ 3 //新增indexOf方法 4 Array.prototype.indexOf = function(item){ 5 var result = -1, 6 arr_item = null; 7 if(this.length == 0) { 8 return result; 9 } 10 for(var i=0,len=this.length; i<len; i++){ 11 arr_item = this[i]; 12 if(arr_item === item){ 13 result = i; 14 break; 15 } 16 } 17 return result; 18 }; 19 } 20
1 function unique1(arr){ 2 var newArr = [];//新建一个数组 3 for(var i=0,len=arr.length;i<len;i++){ 4 if(newArr.indexOf(arr[i]) == -1){//若新数组中未包含该项则将其存入新数组 5 newArr.push(arr[i]); 6 } 7 } 8 return newArr; 9 }
方法二:数组下标去重法
思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,那么表示第i项是重复的,忽略掉。否则存入结果数组。
注意:此方法也用到了“indexOf”方法。
1 function unique2(arr){ 2 var newArr = []; 3 for(var i=0, len=arr.length; i<len; i++){ 4 if(arr.indexOf(arr[i]) == i){ 5 newArr.push(arr[i]); 6 } 7 } 8 return newArr; 9 }
方法三:排序后相邻去重法
思路:将传入的数组进行排序,相同的元素就会相邻。再遍历数组,将元素与新数组的最后一个值进行比较,若不同则加入新数组。
1 function unique3(arr){ 2 arr.sort(); 3 var newArr = [arr[0]]; 4 for(var i=1, len=arr.length; i<len; i++){ 5 if(arr[i] !== newArr[newArr.length-1]){ 6 newArr.push(arr[i]); 7 } 8 } 9 return newArr; 10 }
方法四:优化遍历数组法
思路:遍历传入的数组,元素与右边的元素依次比较,若元素有重复,则结束当前的元素比较,将下一个元素当做比较对象,即跳出内层循环。
1 function unique4(arr){ 2 var newArr = []; 3 for(var i=0,len=arr.length; i<len;i++){ 4 for(var j=i+1;j<len;j++){ 5 if(arr[i] === arr[j]){//获取没重复的最右一值放入新数组 6 ++i; 7 } 8 } 9 newArr.push(arr[i]); 10 } 11 return newArr; 12 }
引申:合并数组并去重
一、concat()方法
思路:concat() 方法将传入的数组或非数组值与原数组合并,组成一个新的数组并返回。该方法会产生一个新的数组。
function concatArr(arr1, arr2){ var arr = arr1.concat(arr2); arr = unique1(arr);//再引用上面的任意一个去重方法 return arr; }
二、Array.prototype.push.apply()
思路:该方法优点是不会产生一个新的数组。
1 var a = [1, 2, 3]; 2 var b = [4, 5, 6]; 3 4 Array.prototype.push.apply(a, b);//a=[1,2,3,4,5,6] 5 //等效于:a.push.apply(a, b); 6 //也等效于[].push.apply(a, b);
1 function concatArray(arr1,arr2){ 2 Array.prototype.push.apply(arr1, arr2); 3 arr1 = unique1(arr1); 4 return arr1; 5 }