几年前总结了3种数组去重的方法,今天再整理一种新的方法,就是es6里面的set(),作为第4种方法增加进来:
1、第一种方法,就是我们上次讨论的方法:
var arr=["a","b","a","c","a","b"];
function unique1(arr){
for(var i =0,uarr=[];i<arr.length;i++){
for(var k =0;k<uarr.length;k++){
if(arr[i] == uarr[k]){
break;
}
}
k==uarr.length && (uarr[k]=arr[i]);
}
return uarr;
}
console.log( unique1(arr) );
2、第二种方法,只是在第一种方法上稍作变化,他们的本质是一样的:
function unique2(arr){
for (var i =0,uarr=[];i<arr.length ;i++ ){
var flag =false;
for (var j=0;j<uarr.length ;j++ ){
if (uarr[j]== arr[i]){
flag =true;
break;
}
}
if(!flag){
uarr[uarr.length] = arr[i];
}
}
return uarr;
}
console.log( unique2(arr) );
3、第三种方法,比较推荐,因为hash的执行效率比较高:
function unique3(arr){
for (var i =0,hash=[];i<arr.length ;i++ ){
if (hash[arr[i]]==undefined){
hash[arr[i]]=1;
}
}
var j=0;
var keys=[];
for (keys[i++] in hash );
return keys;
}
console.log( unique3(arr) );
4、第四种方法,是我最近看到的,用es6新增的set:
Set是一种新的数据结构。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成Set数据结构。
var s = new Set();
arr.map(x => s.add(x));
console.log([...s])
//for (let i of s) {
// console.log(i);
//}
5、前三种方法的执行结果如下:
第4种方法执行结果:
6、确实是 hash 和 set 的效率较高吗?接下来我借用以前看到过的一种方法打印出来,看一下他们的执行时间:
首先要一个比较大的数组,才能看出区别,所以我们这么做:
for(var i = 0,arr =[];i<10000;i++){
arr[arr.length]=parseInt(Math.random()*1000);
}
console.time("unique1");
unique1(arr);
console.timeEnd("unique1");
console.time("unique2");
unique1(arr);
console.timeEnd("unique2");
console.time("unique3");
unique1(arr);
console.timeEnd("unique3");
console.time("unique4");
unique1(arr);
console.timeEnd("unique4");
最后的执行结果为:
由此例就可以非常清楚的看到,hash的执行效率很快,set 更快一点。执行很多次后发现确实set更快。所以平时我们用hash 或者set 去重都是不错的选择。以前我会推荐hash,现在知道了set后,当然我更推荐set。