数组去重方法总结

原创 2018年04月15日 11:41:34

1、使用双重循环
优点:兼容性好

function unique(arr){
    var len=arr.length;
    if(len<=1) return arr;
    var newArr=[];
    for(var i=0;i<len;i++){
        for(var j=0;j<newArr.length;j++){
            if(arr[i]===newArr[j]){
                break;
            }
        }
        // 如果newArr中没有arr[i],则最后j===newArr.length
        if(j===newArr.length){
            newArr.push(arr[i]);
        }
    }
    return newArr;
}

2、使用indexof

function unique(arr){
    if(arr.length<=1) return arr;
    var newArr=[];
    for(var i=0;i<arr.length;i++){
        if(newArr.indexOf(arr[i])===-1)
        newArr.push(arr[i]);
    }
    return newArr;
}

3、先排序再去重
排好序后,只要前后两个数据不相等,就把数据加入新数组
这种方法的效率要比第二种好。

function unique(arr){
    var len=arr.length;
    if(len<=1) return arr;
    arr=arr.sort();
    var newArr=[arr[0]];
    for(var i=1;i<len;i++){
        if(arr[i-1]!==arr[i]){
            newArr.push(arr[i]);
        }
    }
    return newArr;
}

综合第2、3种方法,如果排好序则比较前后两个是否相等,如果没排好序,则使用indexOf进行判断

function unique(arr,isSorted){
    var len=arr.length;
    if(len<=1) return arr;
    var newArr=[arr[0]];
    for(var i=1;i<len;i++){
        if(isSorted){
            if(arr[i-1]!==arr[i]){
                newArr.push(arr[i]);
            }
        }else{
            if(newArr.indexOf(arr[i])==-1){
                newArr.push(arr[i]);
            }
        }

    }
    return newArr;
}

4、filter
利用indexOf返回的是第一次查找到相关元素的下标,如果元素重复,则遍历后边的元素时,不会将后边的元素返回。

function unique(arr){
    var len=arr.length;
    if(len<=1) return arr;
    var newArr=[];
     newArr=arr.filter(function(item,index,array){
        return array.indexOf(item)===index;
    });
    return newArr;
}

先排序:

function unique(arr){
    var len=arr.length;
    if(len<=1) return arr;
    var newArr=[];
     newArr=arr.sort().filter(function(item,index,array){
        return item!==array[index-1];
    });
    return newArr;
}

5、Object键值对
如果obj中由item这个键,则返回true,不会返回该item,不然就把item设为obj的键。
问题:由于object中所有的键都为字符串,所以1和‘1’是相等的。

var array=[1,2,1,1,'1'];
function unique(array){
    var obj={};
    return array.filter(function(item,index,array){
        return obj.hasOwnProperty(item)?false:(obj[item]=true);
    });
}
console.log(unique(array));//[1,2]

改进:
使用typeof item+item作为键,这样的话,1和‘1’对应的键分别为number1、string1,会被认为是不相等的

var array=[1,2,1,1,'1'];
function unique(array){
    var obj={};
    return array.filter(function(item,index,array){
        //console.log(typeof item+item);//number1,number2,number1,number1,string1
        return obj.hasOwnProperty(typeof item+item)?false:(obj[typeof item+item]=true);
    });
}
console.log(unique(array));//[1,2,'1']

ES6:
1、使用Set结构

function unique(array){
    return Array.from(new Set(array));
}

简化:

function unique(array){
    return [...new Set(array)];
}

再简化:

var unique=(array)=>[...new Set(array)];

2、使用Map结构

function unique(arr){
    var map=new Map();
    return arr.filter((item)=>!map.has(item)&&map.set(item,true));
}
console.log(unique([1,1,2,4,4]));
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liwenfei123/article/details/79947878

js数组去重的三种常用方法总结

第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数...
  • wangshu696
  • wangshu696
  • 2015-01-14 18:38:35
  • 6396

java数组去重

/** * * @param longArr 长的数组 * @param smallArr 短的字符串数组 * @return 从长的字符串数组中删除那个短的字符串数组中相同的元素 ...
  • u010256177
  • u010256177
  • 2015-02-11 09:46:58
  • 772

数组去重,简短而有效的方法

var arr = [1,2,3,4,5,6,7,8,1,2,3,4,5,12,13,14,15]; /* js对象里没有重复的key,所以可以通过以下方法来解决数组去重 ...
  • u013415353
  • u013415353
  • 2016-07-03 00:20:30
  • 395

数组去重的五种方法

需求描述:为Array类型添加公共方法Unique,去掉给定数组中的重复元素。 五种方法: /*方法一*/ //为Array类型的prototype对象添加unique1方法 Array....
  • St_Sp_En
  • St_Sp_En
  • 2017-04-18 17:49:28
  • 1398

编写一个数组去重的方法

var arr = [1,2,"2","4",5,2,1]; var newArr = removeRepetition(arr); console.log(newArr); ...
  • weixin_39430694
  • weixin_39430694
  • 2017-11-12 19:00:23
  • 449

使用JavaScript实现数组去重的几种方式

使用JavaScript实现数组去重的四种方式思考 使用indexOf()方法 Array.prototype.dupDect1=function(){ var res=[];//结果数组 ...
  • a1247529789
  • a1247529789
  • 2016-04-26 17:39:58
  • 332

数组去重2种最好的方法

两种具有代表性的js数组去重方法
  • sinat_31597631
  • sinat_31597631
  • 2017-06-13 16:46:50
  • 557

数组去重方法大全

原文链接:再见,重复的你(数组去重)思路一:双层循环,外层循环元素,内层循环时比较值 如果有相同的值则跳过,不相同则push进数组Array.prototype.distinct = functio...
  • a214161398a
  • a214161398a
  • 2016-05-15 13:19:40
  • 4254

面试题——4种数组去重的方法

科技优家 2017-01-04 07:38 数组去重或者其衍生作为笔试题或者机试题出现的几率也是很大的,写出的方法越多,则让面试官觉得你思维越开阔,那么成功的几率当然就大了。 废话不多说,下面...
  • u011277123
  • u011277123
  • 2017-01-05 11:38:04
  • 5742

三种数组去重方法的遍历效率比较

1、第一种方法,就是我们上次讨论的方法: var arr=[&quot;a&quot;,&quot;b&quot;,&quot;a&quot;,&quot;c&quot;,&quot;a&quot;...
  • xie_lu
  • xie_lu
  • 2017-06-28 20:33:05
  • 984
收藏助手
不良信息举报
您举报文章:数组去重方法总结
举报原因:
原因补充:

(最多只允许输入30个字)