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);
自己测试中,总觉得第二种效率最高,不知道其他各位大神有什么好的见解。