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

几年前总结了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种方法执行结果:
四种数组去重方法的遍历效率比较_第1张图片
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");

最后的执行结果为:
四种数组去重方法的遍历效率比较_第2张图片
由此例就可以非常清楚的看到,hash的执行效率很快,set 更快一点。执行很多次后发现确实set更快。所以平时我们用hash 或者set 去重都是不错的选择。以前我会推荐hash,现在知道了set后,当然我更推荐set。

你可能感兴趣的:(js)