JavaScript數(shù)組去重的3種方法和代碼實(shí)例
數(shù)組去重的方法有很多,到底哪種是最理想的,自己不清楚。于是自己測(cè)試了下數(shù)組去重的效果和性能。測(cè)試十萬(wàn)個(gè)數(shù)據(jù),代碼和所耗大概時(shí)間如下。
到底采用哪種方法,根據(jù)實(shí)際情況而定吧。
/*方法一: 1,'1' 會(huì)被認(rèn)為是相同的; 所有hash對(duì)象,如:{x;1},{y:1}會(huì)被認(rèn)為是相同的 //10ms */ Array.prototype.unique=function(){ var newArr=[],obj={}; for(var i=0,len=this.length;i<len;i++){ if(!obj[this[i]]){ newArr.push(this[i]); obj[this[i]]=true; } } return newArr; } /*方法一改進(jìn)版:所有hash對(duì)象,如:{x;1},{y:1}會(huì)被認(rèn)為是相同的 //30ms*/ Array.prototype.unique=function(){ var newArr=[],obj={}; for(var i=0,len=this.length;i<len;i++){ if(!obj[typeof(this[i])+this[i]]){ newArr.push(this[i]); obj[typeof(this[i])+this[i]]=this[i]; } } return newArr; } /*方法二: 去重結(jié)果最好,但耗性能 //250ms*/ Array.prototype.unique=function(){ var newArr=this.concat(); for(var i=0,len=newArr.length;i<len;i++) { for(var j=i+1,len=newArr.length;j<len;j++) { //注意 === if(newArr[i]===newArr[j]) { newArr.splice(j,1); j--; } } } return newArr; } /*方法三: 不能去重hash對(duì)象 //25ms */ Array.prototype.unique = function(){ var newArr = []; //一個(gè)新的臨時(shí)數(shù)組 for(var i = 0,len=this.length; i < len; i++){ if (newArr.indexOf(this[i]) == -1){ //如果當(dāng)前數(shù)組的第i已經(jīng)保存進(jìn)了臨時(shí)數(shù)組,那么跳過,否則把當(dāng)前項(xiàng)push到臨時(shí)數(shù)組里面 newArr.push(this[i]); } } return newArr; } var arr0=[11,21,221,13,24,"134","1",{x:1,y:1},{name:"pobaby",age:"12",hobby:"football"},{name:"pobaby1",age:"121",hobby:"football1"},{x:134},{y:132},{x:143},{y:3421},"神秘人物", "火柴人技巧格斗", "超音速戰(zhàn)場(chǎng)", "小小辛打磚塊", "火柴人技巧格斗", "加菲貓超人", "小小辛打磚塊", "卑鄙的我2", "電流導(dǎo)線", "飛天手推車","神D秘人物", "火柴人S技巧格斗", "超音SD速戰(zhàn)場(chǎng)", "小小SD辛打磚塊", "火柴人SD技巧格斗", "加菲S貓超人", "小小DF辛打磚塊", "卑鄙的FS我2", "電D流導(dǎo)線", "飛天SD手推車","神秘SD人物", "火柴人技D巧格斗", "超音ASD速戰(zhàn)場(chǎng)", "小小辛打SAD磚塊", "火柴人技SD巧格斗", "加菲FDS貓超人", "小小辛打SDF磚塊", "卑鄙SDF的我2", "電流SDF導(dǎo)線", "飛天手DF推車","神秘SD人物", "火柴人技AS巧格斗", "超音速戰(zhàn)FS場(chǎng)", "小小辛SDF打磚塊", "火柴人SDF技巧格斗", "加菲SD貓超人",113,231,2221,123,234,"1334","21",{x:13,y:132},{name:"pobaby2",age:"122",hobby:"football2"},{name:"pobaby13",age:"1231",hobby:"football41"},{x:13544},{y:1352},{x:14543},{y:34521},"神秘人sd物", "火柴人技sd巧格斗", "超音速sd戰(zhàn)場(chǎng)", "小小辛sd打磚塊", "火柴人技巧gw格斗", "加菲貓ui超人", "小小辛yi打磚塊", "卑鄙的yi我2", "電流yt導(dǎo)線", "飛天手ytui推車","神Dyu秘人物", "火yui柴人S技yui巧格斗", "超音SDyu速戰(zhàn)場(chǎng)", "小小SD辛打磚uyi塊", "火柴yui人SD技巧格斗", "加yui菲S貓超人", "小小DF辛打磚ui塊", "卑鄙uyi的FS我2", "電D流導(dǎo)yui線", "飛天SD手推uyi車","神i秘SD人物", "火柴人技Dhk巧格斗", "超音ASD速戰(zhàn)hk場(chǎng)", "小小辛打SAhkD磚塊", "火柴人技SD巧ghk格斗", "加菲FDS貓k超人", "小小辛打SDF磚ytui塊", "卑鄙SDF的yui我2", "電流SDyuF導(dǎo)線", "飛天手yuiDF推車","神iy秘SD人hk物", "火柴uyi人技AS巧格hk斗", "超音hg速戰(zhàn)FS場(chǎng)", "小小辛SDF打磚hjk塊", "火柴人SDF技hj巧格斗", "加菲SDhk貓超人" ]; /*十萬(wàn)個(gè)隨機(jī)數(shù)據(jù)*/ var arr=[],num; for(var i = 0; i < 100000; i++){ num=Math.floor(Math.random()*50); arr.push(arr0[num]); } var t1= new Date().getTime(); console.log(t1); //開始時(shí)間 arr.unique(); //去重 var t2 = new Date().getTime(); console.log(t2); //結(jié)束時(shí)間 console.log(t2-t1);
- javascript數(shù)組去重小結(jié)
- 詳解javascript數(shù)組去重問題
- JavaScript數(shù)組去重的五種方法
- js數(shù)組去重的常用方法總結(jié)
- js實(shí)現(xiàn)數(shù)組去重、判斷數(shù)組以及對(duì)象中的內(nèi)容是否相同
- js算法中的排序、數(shù)組去重詳細(xì)概述
- js取兩個(gè)數(shù)組的交集|差集|并集|補(bǔ)集|去重示例代碼
- javascript數(shù)組去重3種方法的性能測(cè)試與比較
- 兩個(gè)數(shù)組去重的JS代碼
- 詳解JavaScript數(shù)組和字符串中去除重復(fù)值的方法
相關(guān)文章
JavaScript面向?qū)ο缶幊虒?shí)現(xiàn)模擬
面向?qū)ο缶幊?Object Oriented Programming)將現(xiàn)實(shí)世界中的復(fù)雜關(guān)系抽象成一個(gè)個(gè)對(duì)象,通過對(duì)象之間的分工合作對(duì)現(xiàn)實(shí)世界進(jìn)行模擬2022-10-10JavaScript實(shí)現(xiàn)班級(jí)抽簽小程序
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)班級(jí)抽簽小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05js如何查找json數(shù)據(jù)中的最大值和最小值方法
這篇文章主要介紹了js如何查找json數(shù)據(jù)中的最大值和最小值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04uniapp封裝axios的詳細(xì)過程(大可不必那么麻煩)
在uniapp中使用axios進(jìn)行請(qǐng)求時(shí),uniapp無(wú)法使用axios的適配器,下面這篇文章主要給大家介紹了關(guān)于uniapp封裝axios的詳細(xì)過程,需要的朋友可以參考下2022-10-10JavaScript定義變量和變量?jī)?yōu)先級(jí)問題探討
這篇文章主要介紹了JavaScript定義變量和變量?jī)?yōu)先級(jí)的問題探討,變量的定義還有這么講究嗎,不錯(cuò),看完本文相信你會(huì)有一定的收獲,需要的朋友可以參考下2014-10-10js實(shí)現(xiàn)的早期滑動(dòng)門菜單效果代碼
這篇文章主要介紹了js實(shí)現(xiàn)的早期滑動(dòng)門菜單效果代碼,涉及javascript數(shù)組遍歷及通過鼠標(biāo)事件動(dòng)態(tài)改變頁(yè)面元素屬性的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08JS FormData對(duì)象使用方法實(shí)例詳解
這篇文章主要介紹了JS FormData對(duì)象使用方法,結(jié)合實(shí)例形式詳細(xì)分析了FormData對(duì)象的基本功能、原理及使用方法,需要的朋友可以參考下2020-02-02如何手動(dòng)實(shí)現(xiàn)es5中的bind方法詳解
這篇文章主要給大家介紹了關(guān)于如何手動(dòng)實(shí)現(xiàn)es5中的bind方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12JavaScript實(shí)現(xiàn)焦點(diǎn)進(jìn)入文本框內(nèi)關(guān)閉輸入法的核心代碼
這篇文章給大家分享js實(shí)現(xiàn)焦點(diǎn)進(jìn)入文本框內(nèi)關(guān)閉輸入法,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09