javascript數(shù)組去重小結(jié)
前言
最近為了換工作,準(zhǔn)備下面試,開(kāi)始回顧復(fù)習(xí)JavaScript相關(guān)的知識(shí),昨天下午想到了數(shù)組去重的相關(guān)方法,干脆整理出幾篇JavaScript算法文章,以備后用,此系列文章不定篇數(shù),不定時(shí)間,想到哪寫(xiě)到哪,不保證正確性,不保證高效率,只是談?wù)剛€(gè)人理解,如有錯(cuò)誤,請(qǐng)諸位斧正。
關(guān)于去重
數(shù)組去重是一個(gè)比較常見(jiàn)的算法考察點(diǎn),實(shí)現(xiàn)去重的方式無(wú)外乎通過(guò)唯一性和非唯一性。簡(jiǎn)單來(lái)講就是挑出唯一的或者刪除不唯一的。以下所有算法都是我自己瞎命名的,請(qǐng)無(wú)視之。
循環(huán)匹配去重
顧名思義,就是把數(shù)組中的每一個(gè)元素都和存放元素的數(shù)組對(duì)比,遇到不重復(fù)的元素,放入新數(shù)組中,直至循環(huán)結(jié)束,由于匹配也有循環(huán),也可以稱(chēng)為雙循環(huán)匹配去重,這也是大家都能想到的最簡(jiǎn)單的方式。
實(shí)現(xiàn)代碼:
var arr=[1,3,4,56,3,7,9,7];
var result=[];
//匹配
function isMatch(array,n){
for(var i=0;i<array.length;i++){
if(array[i]==n){
return true;
}
}
return false;
};
//驗(yàn)證所有元素
function unqiue(array){
for(var i=0;i<array.length;i++){
if(!isMatch(result,array[i])){
result.push(array[i]);
}
}
return result;
};
console.log(unqiue(arr));
注意:上面方法有一個(gè)bug,當(dāng)存在數(shù)字和數(shù)字形式的字符串的時(shí)候,沒(méi)有區(qū)分出數(shù)字和數(shù)字字符串。因?yàn)樵谄ヅ浜瘮?shù)isMatch()里用的是雙等“==”,沒(méi)有驗(yàn)證元素類(lèi)型,實(shí)際應(yīng)該使用全等“===”。
修改后的代碼如下:
var arr=[1,3,4,56,3,'1',7,9,7];
var result=[];
//匹配
function isMatch(array,n){
for(var i=0;i<array.length;i++){
if(array[i]===n){
return true;
}
}
return false;
};
//驗(yàn)證所有元素
function unqiue(array){
for(var i=0;i<array.length;i++){
if(!isMatch(result,array[i])){
result.push(array[i]);
}
}
return result;
};
console.log(unqiue(arr));
算法優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
實(shí)現(xiàn)簡(jiǎn)單,思路直觀
缺點(diǎn):
效率低下
JSON去重/對(duì)象去重/字典去重
JSON去重,簡(jiǎn)單來(lái)講就是利用Object對(duì)象key的唯一性,將數(shù)組的元素轉(zhuǎn)換為JSON或者說(shuō)對(duì)象的key值。JSON的value存儲(chǔ)數(shù)組的索引index,然后對(duì)JSON對(duì)象進(jìn)行for in循環(huán),存儲(chǔ)到新數(shù)組中。
Array、JSON、{}都是Object,所以采用任意一種都可以實(shí)現(xiàn)此算法。
實(shí)現(xiàn)代碼:
Array方式:
var arr=[1,3,4,56,3,'1',7,9,7];
function unqiue(array){
var cache=[];
var result=[];
//將數(shù)組元素轉(zhuǎn)為對(duì)象的key
for(var i=0;i<array.length;i++){
cache[array[i]]=i;
};
//存儲(chǔ)key(實(shí)際的數(shù)組元素)
for(key in cache){
result.push(key);
};
return result;
}
console.log(unqiue(arr));
JSON方式:
var arr=[1,3,4,56,3,'1',7,9,7];
function unqiue(array){
var cache={};
var result=[];
//將數(shù)組元素轉(zhuǎn)為對(duì)象的key
for(var i=0;i<array.length;i++){
cache[array[i]]=i;
};
//存儲(chǔ)key(實(shí)際的數(shù)組元素)
for(key in cache){
result.push(key);
};
return result;
}
console.log(unqiue(arr));
Object方式:
var arr=[1,3,4,56,3,'1',7,9,7];
function unqiue(array){
var cache=new Object();
var result=[];
//將數(shù)組元素轉(zhuǎn)為對(duì)象的key
for(var i=0;i<array.length;i++){
cache[array[i]]=i;
};
//存儲(chǔ)key(實(shí)際的數(shù)組元素)
for(key in cache){
result.push(key);
};
return result;
}
console.log(unqiue(arr));
算法優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
簡(jiǎn)單
效率非常高
缺點(diǎn):
1.改變了數(shù)組元素的類(lèi)型()
2.有bug(無(wú)非區(qū)分?jǐn)?shù)字和數(shù)字類(lèi)型字符串)
隊(duì)列遞歸去重
昨天晚上思忖良久想到用隊(duì)列的方式,先將數(shù)組排序成升序或降序的隊(duì)列,這樣相同的元素就處在一個(gè)區(qū)域內(nèi),然后從隊(duì)尾向前匹配,如果匹配成功,刪除隊(duì)尾,然后前一個(gè)元素再向其前面的匹配。整個(gè)匹配完成之后,剩下的元素就是去重過(guò)后的隊(duì)列。
var arr=[6, 4, 6, 9, '6', 13, 56, 9, ,'11',1, 8, '7', 17, 5, 45, 3, 7];
function unqiue(array){
//排序數(shù)組,形成隊(duì)列
array.sort(function(m,n){return m-n;});
////排序后,隊(duì)尾向前對(duì)比,如果相同,刪除隊(duì)尾,依次類(lèi)推
function loop(Index){
if(Index>=1){
if(array[Index]===array[Index-1]){
arr.splice(Index,1);
}
loop(Index-1);
}
}
loop(array.length-1);
return array;
}
console.log(unqiue(arr));
算法優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
效率較高
缺點(diǎn):
效率不是最高
INDEXOF去重方式
判斷瀏覽器是否支持indexOf ,indexOf 為ecmaScript5新方法 IE8以下(包括IE8, IE8只支持部分ecma5)不支持
if (!Array.prototype.indexOf){
// 新增indexOf方法
Array.prototype.indexOf = function(item){
var result = -1, a_item = null;
if (this.length == 0){
return result;
}
for(var i = 0, len = this.length; i < len; i++){
a_item = this[i];
if (a_item === item){
result = i;
break;
}
}
return result;
}
}
- JavaScript數(shù)組去重的兩種方法推薦
- JavaScript數(shù)組去重的五種方法
- javascript數(shù)組去重的六種方法匯總
- javascript數(shù)字?jǐn)?shù)組去重復(fù)項(xiàng)的實(shí)現(xiàn)代碼
- 詳解javascript數(shù)組去重問(wèn)題
- JavaScript 數(shù)組去重并統(tǒng)計(jì)重復(fù)元素出現(xiàn)的次數(shù)實(shí)例
- Javascript中數(shù)組去重與拍平的方法示例
- javascript數(shù)組去重方法終極總結(jié)
- javascript 數(shù)組去重復(fù)(在線去重工具)
- JavaScript使用indexOf()實(shí)現(xiàn)數(shù)組去重的方法分析
- JavaScrip數(shù)組去重操作實(shí)例小結(jié)
相關(guān)文章
textContent在Firefox下與innerText等效的屬性
textContent在Firefox下與innerText等效的屬性...2007-05-05
JS+flash實(shí)現(xiàn)chrome和ie瀏覽器下同時(shí)可以復(fù)制粘貼
chrome和ie同時(shí)可以復(fù)制粘貼,想必大家一直思索的問(wèn)題在本文將有一個(gè)不錯(cuò)的實(shí)現(xiàn),下面為大家介紹下JS+flash是如何實(shí)現(xiàn)的,感興趣的朋友可以參考下2013-09-09
JS中數(shù)組隨機(jī)排序?qū)崿F(xiàn)方法(原地算法sort/shuffle算法)
已經(jīng)學(xué)過(guò)JavaScript,我們當(dāng)然就可以用數(shù)組的排序方法,這篇文章主要給大家介紹了關(guān)于JS中數(shù)組隨機(jī)排序?qū)崿F(xiàn)方法的相關(guān)資料,主要包括了原地算法sort/shuffle算法,需要的朋友可以參考下2023-02-02
JS逆向之?webpack?打包站點(diǎn)實(shí)戰(zhàn)原理分享
本文主要介紹了JS逆向之webpack打包站點(diǎn)實(shí)戰(zhàn)原理分享,webpack是前端程序員用來(lái)進(jìn)行打包JS的技術(shù),打包之后的代碼特征非常明顯,更多相關(guān)知識(shí)需要的小伙伴可以參考下面文章詳細(xì)內(nèi)容2022-06-06
深入認(rèn)識(shí)JavaScript中的函數(shù)
深入認(rèn)識(shí)JavaScript中的函數(shù)...2007-01-01
微信小程序開(kāi)發(fā)自定義tabBar實(shí)戰(zhàn)案例(定制消息99+小紅心)
一定的需求情況下無(wú)法使用小程序原生的tabbar的時(shí)候,需要自行實(shí)現(xiàn)一個(gè)和tabbar功能一模一樣的自制組件,下面這篇文章主要給大家介紹了關(guān)于微信小程序開(kāi)發(fā)自定義tabBar(定制消息99+小紅心)的相關(guān)資料,需要的朋友可以參考下2022-12-12
關(guān)于JAVASCRIPT urldecode URL解碼的問(wèn)題
JS要實(shí)現(xiàn)單純的編碼解碼輕而易舉,escape、unescape就搞定,但是遇到不是完整的URL轉(zhuǎn)碼,就沒(méi)辦法了2012-01-01

