亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

關于js數組去重的問題小結

2019-11-20 21:12:45
字體:
來源:轉載
供稿:網友

1.根據js對象中key不重復的原則,構思出數組去重的方法,按照最常規的思維如下:

復制代碼 代碼如下:

function distinctArray(arr){
var obj={},temp=[];
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){
temp.push(arr[i]);
obj[arr[i]] =true;
}
}
return temp;
   }
   var testarr=[1,2,3,2];
   console.log(distinctArray(testarr));// [1,2,3]

看起來還不錯的樣子哦,但是如果變成一下情況:
var testarr1=[1,2,3,"2"];
console.log(distinctArray(testarr));// [1,2,3]
竟然還是一樣的結果,這就并非我們想要的了,我們需要的結果應該是[1,2,3,"2"].即去重的過程中需要保證類型的完整性。

針對以上情況,我們對上述方法進行改進:

復制代碼 代碼如下:

function distinctArrayImprove(arr){
var obj={},temp=[];
for(var i=0;i<arr.length;i++){
if(!obj[typeof (arr[i])+arr[i]]){
temp.push(arr[i]);
obj[typeof (arr[i])+arr[i]] =true;
}
}
return temp;
}

以上方法在向對象中放key的時候加了typeof的前綴,那么讓我們看看效果吧。
var testarr1=[1,2,3,"2"];
console.log(distinctArray(testarr));// [1,2,3,"2"]
哎呦,不錯哦!那么是不是這個函數就徹底ok呢,讓我們再看一種情況!
var testarr1=[1,2,3,"2",{a:1},{b:1}];
console.log(distinctArray(testarr));// [1,2,3,"2",{a:1}]
竟然出現這個結果,怎么把{b:1}給莫名其妙的刪掉了呢,去重的過程中如果出現誤刪除有用的數據可是很嚴重的問題,所以以上方法也不是perfect的一種,那就讓我們接著往下看吧。

2.在1中我們的主要思想是利用js對象中key不重復的理念來指導我們的思維,但是最終沒有解決所有的問題,那么接著我們可以考慮換一種思維模式來實現我們想要的功能。

用slice和splice方法來實現數組的去重,如下:

復制代碼 代碼如下:

function distinctArray2(arr){
var temp=arr.slice(0);//數組復制一份到temp
for(var i=0;i<temp.length;i++){
for(j=i+1;j<temp.length;j++){
if(temp[j]==temp[i]){
temp.splice(j,1);//刪除該元素
j--;
}
}
}
return temp;
}

測試:
var testarr1=[1,2,3,"2"];
console.log(distinctArray(testarr));// [1,2,3]
var testarr2=[1,2,2,{a:1},{a:1},{a:1,b:2},function(){alert("b");},function(){alert("b");}];
//[1,2,{a:1},{a:1},{a:1,b:2},function(){alert("b");},function(){alert("b");}]

測試結果仍然不能滿足我們的需求,腫么辦?經過我們隊以上方法的研究,我們發現主要的問題出在比較兩個對象相等的操作上,distinctArray2中利用”==“來比較,并不能區分大對象的內容是否相等,鑒于此種情況,我們另外寫了一個方法:

復制代碼 代碼如下:

function distinctArrayAll(arr){
var isEqual=function(obj1,obj2){
//兩個對象地址相等,必相等
if(obj1===obj2){
return true;
}
if(typeof(obj1)==typeof(obj2)){
if(typeof(obj1)=="object"&&typeof(obj2)=="object"){
var pcount=0;
for(var p in obj1){
pcount++;
if(!isEqual(obj1[p],obj2[p])){
return false;
}
}
for(var p in obj2){
pcount--;
}
return pcount==0;
}else if(typeof(obj1)=="function"&&typeof(obj2)=="function"){
if(obj1.toString()!=obj2.toString()){
return false;
}
}else {
if(obj1!=obj2){
return false;
}
}
}else{
return false;
}
return true;
}
var temp=arr.slice(0);//數組復制一份到temp
for(var i=0;i<temp.length;i++){
for(j=i+1;j<temp.length;j++){
if(isEqual(temp[j],temp[i])){
temp.splice(j,1);//刪除該元素
j--;
}
}
}
return temp;
}

測試:
var testArr3=[1,2,2,{a:1},{a:1},{a:1,b:2},function(){alert("b");},function(){alert("b");}];
console.log(distinctArrayAll(testArr3));
//結果 [1,2,{a:1},{a:1,b:2},function(){alert("b");}]

哎呀,終于順利完成去重的任務了,至于每個方法的性能問題,我們留待下一次討論!我們可以看出最后一種方法是萬能去重法,可以針對復雜數組來去重,但是相應的執行開銷也是相當大的,在實際的項目開發中有時我們需要的可能僅僅是純數字或者純字符串的去重,這就要求我們根據需求靈活選用相應的算法,不求太perfect,只求在滿足需求的基礎上使程序效率更高!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产依人香蕉在线精品| 日韩精品999| 国产精品视频内| 2019中文字幕在线免费观看| 国产精品第三页| 亚洲成人久久一区| 欧美综合第一页| 欧美午夜片在线免费观看| 亚州成人av在线| 成人h视频在线观看播放| 国产午夜精品麻豆| 国产精品美女视频网站| 亚洲女人天堂色在线7777| 97久久超碰福利国产精品…| 久久久精品国产网站| 国产精品久久久久久av福利软件| 亚洲国产精品va在看黑人| 久久成人av网站| 国内精品伊人久久| 国产精品成人品| 国产精品www| 精品国产乱码久久久久久虫虫漫画| 欧美性xxxxx极品| 国产亚洲欧洲高清一区| 久久精品美女视频网站| 久久久久久久色| 成人在线一区二区| 欧美性猛交xxxx乱大交3| 国产成人精品视频在线| 亚洲性夜色噜噜噜7777| 国语自产精品视频在线看抢先版图片| 国产精品毛片a∨一区二区三区|国| 最近更新的2019中文字幕| 欧美精品一区三区| 欧美激情视频网站| 欧美—级高清免费播放| 日本一区二区三区四区视频| 久久久久久久久综合| 国产亚洲精品久久久久久777| 亚洲美女性视频| 国产精品人人做人人爽| 中文字幕亚洲欧美日韩高清| 91性高湖久久久久久久久_久久99| 亚洲人线精品午夜| 亚洲色图五月天| 日韩av免费在线播放| 欧美做受高潮1| 欧美激情精品久久久久久| 欧美丝袜一区二区三区| 欧美成人激情图片网| 最近中文字幕mv在线一区二区三区四区| 色综合久久精品亚洲国产| 欧洲成人免费视频| 国产精品极品美女在线观看免费| 国产欧美va欧美va香蕉在线| 国产欧亚日韩视频| www.日韩免费| 欧美午夜美女看片| 国产网站欧美日韩免费精品在线观看| www亚洲欧美| 少妇高潮 亚洲精品| 国产精品∨欧美精品v日韩精品| 欧美性猛交xxxx免费看久久久| 亚洲福利在线视频| 久久99精品久久久久久琪琪| 日韩第一页在线| 97av在线影院| 欧美在线激情视频| 亚洲天堂成人在线| 国产亚洲视频中文字幕视频| 欧美高清视频一区二区| 久久精品电影网| 欧美裸体xxxx极品少妇| 国产精品h在线观看| 欧美日韩aaaa| 亚洲男人天堂2019| 97超碰蝌蚪网人人做人人爽| 亚洲人成网7777777国产| 国产成人亚洲综合青青| 欧美理论电影网| 欧美精品免费在线观看| 久久99国产综合精品女同| 日韩av在线影院| 亚洲一区免费网站| 亚洲一区二区三区毛片| 成人免费午夜电影| 日韩中文字幕免费看| 日韩视频在线一区| 性亚洲最疯狂xxxx高清| 精品日本美女福利在线观看| 久久久av免费| 国产精品精品久久久久久| 亚洲老板91色精品久久| 日韩在线观看电影| 一本一道久久a久久精品逆3p| 欧美亚洲午夜视频在线观看| 欧美成人免费在线观看| 精品亚洲永久免费精品| 日韩一二三在线视频播| 色偷偷偷亚洲综合网另类| 日韩视频中文字幕| 欧美视频第一页| 91久久精品国产91久久| 2019中文字幕在线| 国产日韩精品综合网站| 奇米成人av国产一区二区三区| 欧美另类99xxxxx| 国产精品亚洲精品| 久久久久久中文字幕| 97在线免费观看视频| 欧美精品一区二区三区国产精品| 最近中文字幕日韩精品| 91久久精品国产91性色| 亚洲视频在线免费观看| 亚洲国产欧美一区二区三区久久| 97在线视频观看| 久久成人精品一区二区三区| 国产精品美女在线| 九九热这里只有在线精品视| 久久久91精品国产一区不卡| 亚洲精品www久久久久久广东| 国产福利精品视频| 国产精品7m视频| 日韩av片免费在线观看| 久久免费少妇高潮久久精品99| 日韩美女写真福利在线观看| 欧美大全免费观看电视剧大泉洋| 亚洲一区二区三区乱码aⅴ蜜桃女| 一区二区三区回区在观看免费视频| 欧美小视频在线观看| 中文字幕国产精品| 亚洲精品suv精品一区二区| 精品久久久久久| 91牛牛免费视频| 中文字幕欧美日韩| 91精品国产免费久久久久久| 国产精品久久久久久久久久| 亚洲精品aⅴ中文字幕乱码| 亚洲美女av在线播放| 国产精品日韩精品| 日韩中文在线中文网在线观看| 日本高清不卡的在线| 亚洲国产成人精品女人久久久| 91国产高清在线| 成人免费高清完整版在线观看| 亚洲一区二区中文| 成人国产精品久久久久久亚洲| 日韩在线激情视频| 国产成人精品视频在线观看| 午夜精品理论片| 日韩中文字幕在线精品| 欧美性猛交xxxx免费看久久久| 精品国产31久久久久久| 国产视频精品在线| 欧美日韩日本国产| 国产精品一区二区三区成人| 国产aaa精品| 日本精品一区二区三区在线播放视频| 精品在线小视频| 欧美精品免费播放| 久久国内精品一国内精品| 欧美怡春院一区二区三区| 日韩小视频网址| 国产精品入口免费视频一|