js實(shí)現(xiàn)數(shù)組去重方法及效率對(duì)比
其實(shí)網(wǎng)上搜索這些方法一堆堆的,之所以還來寫一遍主要是因爲(wèi)自己習(xí)慣一種之後就忘了其他方法怎麼實(shí)現(xiàn),就寫一寫總結(jié)一下,順便做個(gè)測(cè)試看看哪個(gè)效率最高,爲(wèi)了更好展示效果,我會(huì)先總結(jié)認(rèn)爲(wèi)比較好的方法,後面統(tǒng)一測(cè)試。(溫馨提示:下文衹是爲(wèi)了簡(jiǎn)便,一般情況下不建議寫在原型上,容易污染全局)
一,通過尋找對(duì)象屬性
var n = [14,12,2,2,2,5,32,2,59,5,6,33,12,32,6]; Array.prototype.unique1 = function(){ var obj = {}, ary = [], i= 0, len = this.length; for(; i<len; i++){ if(!obj[this[i]]){ obj[this[i]] = 1; ary.push(this[i]); } } return ary.sort(function(a,b){return a - b}); } console.log(n.unique1());
二,通過尋找數(shù)組位置
var n = [14,12,2,2,2,5,32,2,59,5,6,33,12,32,6]; Array.prototype.unique2 = function(){ var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(ary.indexOf(this[i]) == -1) ary.push(this[i]); } return ary.sort(function(a,b){return a - b}); } console.log(n.unique2());
三,跟尋找數(shù)組位置類似,搜索數(shù)字第一次出現(xiàn)的位置是不是跟當(dāng)前位置一樣
var n = [14,12,2,2,2,5,32,2,59,5,6,33,12,32,6]; Array.prototype.unique3 = function(){ var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(this.indexOf(this[i]) == i) ary.push(this[i]); } return ary.sort(function(a,b){return a - b}); } console.log(n.unique3());
四,比較常規(guī),先排序,再比較前後兩個(gè)數(shù)字是不是相等
var n = [14,12,2,2,2,5,32,2,59,5,6,33,12,32,6]; Array.prototype.unique4 = function(){ this.sort(function(a,b){return a - b}); var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(this[i] !== this[i-1]) ary.push(this[i]); } return ary; } console.log(n.unique4());
接下來是網(wǎng)上比較少的效率比較了,也是本文重點(diǎn),我們先生成一個(gè)計(jì)時(shí)函數(shù)統(tǒng)一比較
首先生成一個(gè)一百數(shù)字的數(shù)組
Array.prototype.unique1 = function(){ var obj = {}, ary = [], i= 0, len = this.length; for(; i<len; i++){ if(!obj[this[i]]){ obj[this[i]] = 1; ary.push(this[i]); } } return ary.sort(function(a,b){return a - b}); } Array.prototype.unique2 = function(){ var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(ary.indexOf(this[i]) == -1) ary.push(this[i]); } return ary.sort(function(a,b){return a - b}); } Array.prototype.unique3 = function(){ var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(this.indexOf(this[i]) == i) ary.push(this[i]); } return ary.sort(function(a,b){return a - b}); } Array.prototype.unique4 = function(){ this.sort(function(a,b){return a - b}); var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(this[i] !== this[i-1]) ary.push(this[i]); } return ary; } function randomAry (n) { var ary = [],i=0; for(; i<n; i++){ ary.push(Math.ceil(Math.random()*10000)); } console.log(ary) return ary; } function useTime (fn) { var start = new Date(); fn(); var end = new Date(); console.log('本次函數(shù)運(yùn)行花了:' + (end - start) + '毫秒'); } var ary = randomAry(100), fn1 = function(){ ary.unique1() }, fn2 = function(){ ary.unique2() }, fn3 = function(){ ary.unique3() }, fn4 = function(){ ary.unique4() }; useTime(fn1); useTime(fn2); useTime(fn3); useTime(fn4);
結(jié)果在我的谷歌瀏覽器發(fā)現(xiàn)
方法一:0毫秒
方法二:1毫秒
方法三:0毫秒
方法四:00毫秒
(嗯,果然現(xiàn)代瀏覽器強(qiáng)大無比,不吐槽舊瀏覽器了)
看看1000個(gè)數(shù)字
Array.prototype.unique1 = function(){ var obj = {}, ary = [], i= 0, len = this.length; for(; i<len; i++){ if(!obj[this[i]]){ obj[this[i]] = 1; ary.push(this[i]); } } return ary.sort(function(a,b){return a - b}); } Array.prototype.unique2 = function(){ var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(ary.indexOf(this[i]) == -1) ary.push(this[i]); } return ary.sort(function(a,b){return a - b}); } Array.prototype.unique3 = function(){ var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(this.indexOf(this[i]) == i) ary.push(this[i]); } return ary.sort(function(a,b){return a - b}); } Array.prototype.unique4 = function(){ this.sort(function(a,b){return a - b}); var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(this[i] !== this[i-1]) ary.push(this[i]); } return ary; } function randomAry (n) { var ary = [],i=0; for(; i<n; i++){ ary.push(Math.ceil(Math.random()*10000)); } console.log(ary) return ary; } function useTime (fn) { var start = new Date(); fn(); var end = new Date(); console.log('本次函數(shù)運(yùn)行花了:' + (end - start) + '毫秒'); } var ary = randomAry(1000), fn1 = function(){ ary.unique1() }, fn2 = function(){ ary.unique2() }, fn3 = function(){ ary.unique3() }, fn4 = function(){ ary.unique4() }; useTime(fn1); useTime(fn2); useTime(fn3); useTime(fn4); 方法一:1-2毫秒 方法二:40-50毫秒 方法三:40-50毫秒 方法四:0-1毫秒 看看10000個(gè)數(shù)字(數(shù)據(jù)龐大,開始吃不消了,等個(gè)五六秒吧) Array.prototype.unique1 = function(){ var obj = {}, ary = [], i= 0, len = this.length; for(; i<len; i++){ if(!obj[this[i]]){ obj[this[i]] = 1; ary.push(this[i]); } } return ary.sort(function(a,b){return a - b}); } Array.prototype.unique2 = function(){ var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(ary.indexOf(this[i]) == -1) ary.push(this[i]); } return ary.sort(function(a,b){return a - b}); } Array.prototype.unique3 = function(){ var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(this.indexOf(this[i]) == i) ary.push(this[i]); } return ary.sort(function(a,b){return a - b}); } Array.prototype.unique4 = function(){ this.sort(function(a,b){return a - b}); var ary = [], i= 0, len = this.length; for(; i<len; i++){ if(this[i] !== this[i-1]) ary.push(this[i]); } return ary; } function randomAry (n) { var ary = [],i=0; for(; i<n; i++){ ary.push(Math.ceil(Math.random()*10000)); } console.log(ary) return ary; } function useTime (fn) { var start = new Date(); fn(); var end = new Date(); console.log('本次函數(shù)運(yùn)行花了:' + (end - start) + '毫秒'); } var ary = randomAry(10000), fn1 = function(){ ary.unique1() }, fn2 = function(){ ary.unique2() }, fn3 = function(){ ary.unique3() }, fn4 = function(){ ary.unique4() }; useTime(fn1); useTime(fn2); useTime(fn3); useTime(fn4);
因爲(wèi)數(shù)據(jù)龐大,我衹拿一次數(shù)據(jù),你們喜歡就刷新幾次比較唄
方法一:10毫秒
方法二:1258毫秒
方法三:2972毫秒
方法四:5毫秒
原本還想給更大的數(shù)據(jù)看看,然後十萬個(gè)我的頁面就奔潰了。。。潰了。。。了
然後試試五萬個(gè),也奔潰了。。。潰了。。。了
那就算吧,
反正在一萬個(gè)數(shù)據(jù)裏面對(duì)比,數(shù)據(jù)越大,方法一跟方法四按毫秒遞增,方法二跟方法三效率感人
效率計(jì)算:4>1>2>3
方法計(jì)算: 先排序,再比較前後兩個(gè)數(shù)字是不是相等 > 通過尋找對(duì)象屬性 > 通過尋找數(shù)組位置 > 搜索數(shù)字第一次出現(xiàn)的位置是不是跟當(dāng)前位置一樣
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
基于layer.js實(shí)現(xiàn)收貨地址彈框選擇然后返回相應(yīng)的地址信息
這篇文章主要介紹了基于layer.js實(shí)現(xiàn)收貨地址彈框選擇然后返回相應(yīng)的地址信息,需要的朋友可以參考下2017-05-05使用Taro實(shí)現(xiàn)小程序商城的購(gòu)物車功能模塊的實(shí)例代碼
這篇文章主要介紹了使用Taro實(shí)現(xiàn)的小程序商城的購(gòu)物車功能模塊,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06js生成的驗(yàn)證碼的實(shí)現(xiàn)與技術(shù)分析
本文主要是分享了一段由JS生成驗(yàn)證碼并驗(yàn)證的代碼,非常簡(jiǎn)單,并分析了此方法的實(shí)用性,提供給大家參考下2014-09-09Javascript hasOwnProperty 方法 & in 關(guān)鍵字
hasOwnProperty :如果 object 具有指定名稱的屬性,那么方法返回 true;反之則返回 false。2008-11-11js實(shí)現(xiàn)數(shù)組內(nèi)數(shù)據(jù)的上移和下移的實(shí)例
下面小編就為大家?guī)硪黄猨s實(shí)現(xiàn)數(shù)組內(nèi)數(shù)據(jù)的上移和下移的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11