JS的四种数组去重方式

今天去面试,其他有这么一道题,给出一个js数组,然后把数组中重复的元素去掉。当时没怎么想到好方法,就直接用的循环套循环的方式做的,现在网上搜了一下,发现还有更好的方式,总共整理了四种:

function getArray(){
		var arr = [];
		for(var i = 0; i < 10000; i++){
			arr[i] = (Math.random() * 100);
		}
		console.log(arr);
		return arr;
	};
	
	//此方法就是用的纯粹的循环套循环
	function unique1(array) {
		var starttime = new Date().getUTCMilliseconds();
		var newArray = [];
		var len = array == undefined ? 0 : array.length;
		for(var i = 0; i < len; i++) {
			var count = 0;
			for(var j = 0; j < newArray.length; j++) {
				if(newArray[j] == array[i]) {
					count++;
					break;
				}
			}
			if(count == 0){
				newArray.push(array[i]);
			}
		}
		var endtime = new Date().getUTCMilliseconds();
		console.log("1---------耗时-------"+(endtime-starttime));
		return newArray;
	}
	//方法用的是hash表。把已经出现过的通过下标的形式存入一个object内。下标的引用要比用indexOf搜索数组快的多
	function unique2(array) {
		var starttime = new Date().getUTCMilliseconds();
		var newArray = [];
		var hash = {};//作为hash表
		var len = array == undefined ? 0 : array.length;
		for(var i = 0; i < len; i++){
			if(!hash[array[i]]){
				newArray.push(array[i]);
				hash[array[i]] = true;//将数组元素已下标的形式存入hash表中
			}
		}
		var endtime = new Date().getUTCMilliseconds();
		console.log("2---------耗时-------"+(endtime-starttime));
		return newArray;
	}
	
	//此方法的目的是利用indexOf寻找存入参数在数组中第一次出现的位置。很显然,js引擎在实现这个方法的时候会遍历数组直到找到目标为止。所以此函数会浪费掉很多时间。
	function unique3(array) {
		var starttime = new Date().getUTCMilliseconds();
		var newArray = [];
		var len = array == undefined ? 0 : array.length;
		for(var i = 0; i < len; i++){
			if(newArray.indexOf(array[i]) == -1){
				newArray.push(array[i]);
			}
		}
		var endtime = new Date().getUTCMilliseconds();
		console.log("3---------耗时-------"+(endtime-starttime));
		return newArray;
	}
	
	//先排序,在相邻的两个元素比较,不同的话存入新数组,相同就不存
	function unique4(array) {
		var starttime = new Date().getUTCMilliseconds();
		var newArray = [];
		var len = array == undefined ? 0 : array.length;
		if(len > 0) {
			array.sort();
		}
		newArray[0] = array[0];
		for(var i = 1; i < len; i++){
			if(array[i] != array[i-1]){
				newArray.push(array[i]);
			}
		}
		var endtime = new Date().getUTCMilliseconds();
		console.log("3---------耗时-------"+(endtime-starttime));
		return newArray;
	}
	
	var array = getArray();
	unique1(array);
	unique2(array);
	unique3(array);
	unique4(array);

自己测试中,总觉得第二种效率最高,不知道其他各位大神有什么好的见解。

猜你喜欢

转载自dove19900520.iteye.com/blog/2292993