亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        javascript實(shí)現(xiàn)數(shù)組去重的多種方法

        字號(hào):


            這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)數(shù)組去重的多種方法,感興趣的小伙伴們可以參考一下
            先說(shuō)說(shuō)這個(gè)實(shí)例的要求:寫一個(gè)方法實(shí)現(xiàn)數(shù)組的去重。(要求:執(zhí)行方法,傳遞一個(gè)數(shù)組,返回去重后的新數(shù)組,原數(shù)組不變,實(shí)現(xiàn)過(guò)程中只能用一層循環(huán),雙層嵌套循環(huán)也可寫,只做參考);
            先給初學(xué)者解釋一下什么叫數(shù)組去重(老鳥(niǎo)跳過(guò)):意思就是講數(shù)組里面重復(fù)的元素去掉,比如說(shuō)var arr = [3,2,4,2,1,2]; 數(shù)組去重得到的新數(shù)組是 [3,2,4,1],就是這么一個(gè)功能。
            實(shí)現(xiàn)方法比較簡(jiǎn)單,實(shí)現(xiàn)的方式也比較多,很多大牛也寫過(guò)相關(guān)的文章,之所以寫這邊博客,旨在一是備忘,二是給初學(xué)者能更好的理解其實(shí)現(xiàn)的原理,好,我們看第一種實(shí)現(xiàn)方式:
            第一種,通過(guò)遍歷新數(shù)組來(lái)去重
            var arr = [1,'b','b',4,3,3,4,5,1];
                //第一種
                Array.prototype.unique1 = function(){
                  var arr1 = []; //定義一個(gè)新數(shù)組
                  for(var i=0;i<this.length;i++){
                    if(arr1.indexOf(this[i]) == -1){//判斷目標(biāo)數(shù)組中在原數(shù)組里是否存在
                      arr1.push(this[i]);
                    } 
                  } 
                  return arr1;
                }
                console.log(arr); //[1,'b','b',4,3,3,4,5,1]
                console.log(arr.unique1()); //[1, "b", 4, 3, 5]
                //這種方法的主要思路就是,新建一個(gè)數(shù)組,然后在原數(shù)組中,從第一個(gè)開(kāi)始,看看新數(shù)組里面有沒(méi)有這個(gè)元素,如果有,就忽略,然后進(jìn)行下一個(gè),如果沒(méi)有,則把這個(gè)元素存到新數(shù)組里面,
                //也就是說(shuō),每一次比較,都會(huì)遍歷新數(shù)組,直到找到相同元素為止,比較耗性能
            如果大家不習(xí)慣這個(gè)寫法,可以改成下面的寫法,效果是一樣的:
            var arr = [1,'b','b',4,3,3,4,5,1];
            function unique1(arr){
                  var arr1 = [];
                  for(var i=0;i<arr.length;i++){
                    if(arr1.indexOf(arr[i]) == -1){//判斷目標(biāo)數(shù)組中在原數(shù)組里是否存在
                      arr1.push(arr[i]); 
                    } 
                  } 
                  return arr1;
                }
                console.log(arr); //[1,'b','b',4,3,3,4,5,1]
                console.log(unique1(arr)); //[1, "b", 4, 3, 5]
            下面的方法我就不改寫法了,你們可以按照上面的格式來(lái)改寫一下,結(jié)果我也不輸出了,因?yàn)榻Y(jié)果是一樣的,注釋寫在代碼中,慢慢體會(huì)一下
            第二種,通過(guò)hash表(這個(gè)概念有點(diǎn)大,具體原理就不在這里細(xì)說(shuō)了,有時(shí)間我會(huì)單獨(dú)寫一遍,這是好東西)實(shí)現(xiàn)
            var arr = [1,'b','b',4,3,3,4,5,1];
            Array.prototype.unique2 = function(){
                  var hash = {}; //定義一個(gè)hash表
                  var arr1 = []; //定義一個(gè)新數(shù)組
                  for(var i=0;i<this.length;i++){
                    /*
                      這里比較難理解,我們一步一步來(lái)看:
                      hash是一個(gè)對(duì)象,則存在鍵值對(duì)(key:value),只不過(guò)現(xiàn)在是為空的,所以hash[key] = value;
                      第一步:i=0;this[i]=this[0]=1; hash[this[0]] = hash[1] , 因?yàn)閔ash初始為空,沒(méi)有找到key=1的值,所以然后undefined,
                      執(zhí)行下一步:hash[1] = true(此時(shí)hash對(duì)象就有了第一組鍵值對(duì)),將原數(shù)組的第一個(gè)數(shù)添加到新數(shù)組中,重復(fù)第一步
                      因?yàn)椴恢貜?fù)的判斷hash的值都是undefined,而重復(fù)的都為true了,所以不重復(fù)都被添加到新數(shù)組中
                      因?yàn)閔ash表存的值是存的地址,放在堆內(nèi)存中,所以有多少個(gè)不重復(fù)的元素,就要分多少個(gè)內(nèi)存來(lái)存放,所以這種方法比較占內(nèi)存,但是相比之下,這種的運(yùn)算運(yùn)動(dòng)是最快的,
                      這也就是用空間來(lái)?yè)Q取時(shí)間了,數(shù)據(jù)量比較小,推薦用此方法
                    */
                    if(! hash[this[i]]){
                      hash[this[i]] = true;
                      arr1.push(this[i]);
                    }
                  }
                  return arr1;  
                }
                console.log(arr);
                console.log(arr.unique2());
            第三種,通過(guò)遍歷自身的位置是否一致來(lái)實(shí)現(xiàn)
            var arr = [1,'b','b',4,3,3,4,5,1];
            Array.prototype.unique3 = function(){
                  var arr1 = []; //定義一個(gè)新數(shù)組
                  for(var i=0;i<this.length;i++){
                    if(this.indexOf(this[i])==i){
                    //這里也是indexOf遍歷,看從第一個(gè)元素在原數(shù)組中的位置,如果第一次出現(xiàn)的位置和下標(biāo)相等,說(shuō)明當(dāng)前元素的不重復(fù)的,如果不等,說(shuō)明該元素前面已經(jīng)出現(xiàn)過(guò)
                      arr1.push(this[i]);
                    }
                  }
                  return arr1;  
                }
                console.log(arr);
                console.log(arr.unique3());
            第四種,這個(gè)有點(diǎn)意思,只能運(yùn)用到特殊場(chǎng)合,就是先跟數(shù)組排序,然后22比較,輸出一個(gè)排序過(guò)的新數(shù)組
            Array.prototype.unique4 = function(){
                  /*
                    這里是思路是,先排序(默認(rèn)從小到大),然后將原數(shù)組的第一個(gè)給新數(shù)組,
                    因?yàn)槭墙?jīng)過(guò)排序的,所以重復(fù)的只會(huì)存在在相鄰位置
                    這里就相當(dāng)于是做22比較,如果相等,則進(jìn)行下一組,如果不相等,則把這個(gè)數(shù)存到新數(shù)組中,用這個(gè)數(shù)再進(jìn)行比較
                  */
                  this.sort();
                  var arr1 = [this[0]];
                  for(var i=1;i<this.length;i++){
                    if(this[i] !== arr1[arr1.length-1]){
                      arr1.push(this[i]);
                    } 
                  }
                  return arr1;  
                }
                console.log(arr);
                console.log(arr.unique4());
            完結(jié)!
            要求里面還說(shuō),可以使用雙層嵌套循環(huán)來(lái)實(shí)現(xiàn),無(wú)法就是用2層for循環(huán),讓每一個(gè)與原數(shù)組去比較
            Array.prototype.unique5 = function(){
                  //雙層循環(huán),一一比較
                  for(var i=0;i<this.length;i++){ //從0開(kāi)始
                    for(j= i+1;j<this.length;j++){ //從1開(kāi)始,逐個(gè)比較
                      if(this[i] === this[j]){ //如果恒定
                        this.splice(j,1);  //就將這個(gè)元素刪掉
                      } 
                    } 
                  }
                  return this;  
                }
                console.log(arr);
                console.log(arr.unique5());
            這種寫法的循環(huán)次數(shù)太多,不推薦,有人會(huì)說(shuō),第一種和第三種不也是每次都遍歷一遍嗎?跟第5種感覺(jué)也差不多呢?是的,你能這么理解,說(shuō)明你理解了,但是呢,又不是特別的理解,我們說(shuō)差不多那可就差太多了,indexOf()表示的是找到第一個(gè)匹配的元素就會(huì)停止遍歷,而第5種則是不管找不找得到,都會(huì)把整個(gè)數(shù)組遍歷一遍,如果數(shù)據(jù)量大,那你覺(jué)得哪個(gè)性能要好一點(diǎn)?
            特別注意的一點(diǎn):如果在比較兩兩之間的值是全等或不等的時(shí)候,一定要用恒定(===)和不恒定(!==),因?yàn)檫@會(huì)涉及到元素的類型上,如 1與'1'是不恒等的!
            上面的可真是干貨了,一點(diǎn)水分都沒(méi)有,只能靠大家自己領(lǐng)悟了!