欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS的四种数组去重方式

程序员文章站 2022-05-07 11:41:50
...

今天去面试,其他有这么一道题,给出一个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);

 

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

相关标签: js 数组 去重