数组去重
Posted 一颗橙子树
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组去重相关的知识,希望对你有一定的参考价值。
总结下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 }
以上是关于数组去重的主要内容,如果未能解决你的问题,请参考以下文章