国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js數(shù)組去重方法分析與總結(jié)

nevermind / 1597人閱讀

摘要:階段該階段主要通過循環(huán)遍歷數(shù)組從而達到去重的目的多次循環(huán)去掉重復元素以下所有方法默認都那拿該數(shù)組進行測試結(jié)果如下圖可見除了沒有去掉,其他效果都還挺好。

數(shù)組去重經(jīng)常被人拿來說事,雖然在工作中不常用,但他能夠很好的考察js基礎知識掌握的深度和廣度,下面從js的不同階段總結(jié)一下去重的方法。

ES3階段

該階段主要通過循環(huán)遍歷數(shù)組從而達到去重的目的

多次循環(huán)去掉重復元素

// 以下所有方法默認都那拿該數(shù)組進行測試
var array = [1, 1, "1", "1", null, null, undefined, undefined, new String("1"), new String("1"), /a/, /a/, NaN, NaN,{},{},[],[],{name: "eric",sex: "male"},{sex: "male",name: "eric"}];
function unique_es3_on2 (arr) {
    var len = arr.length,
        i = 0,
        j,
        flag,
        ret = [];
    for (; i < len ; i++) {
      flag = true;
      for (j = i+1 ; j < len ; j++) {
        if (arr[i] === arr[j]) {
          flag = false;
          break;
        }
      }
      if(flag) {
        ret.push(arr[i]);
      }
    }
    return ret;
}
unique_es3_on2(array)

結(jié)果如下圖:

可見除了NaN沒有去掉,其他效果都還挺好。原因就是NaN===NaN的結(jié)果是false。還有就是使用嵌套的循環(huán),時間復雜度高,性能不是很好。

借助新的對象單次循環(huán)去掉重復元素

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

結(jié)果如下圖:

雖然時間復雜度不高了,但是效果并不好。因為對象的屬性是字符串,所以會把數(shù)組所有元素默認轉(zhuǎn)化為字符串,就會產(chǎn)生以下問題:

數(shù)值1和字符串"1"以及包裝類型new String("1"),轉(zhuǎn)化為字符串以后是相同的會被去掉。

對象轉(zhuǎn)化為字符串以后會被誤判,[]==>"",{}==>"[object Object]",還有就是形式相同,內(nèi)存地址不同的對象會被去除。

為了解決類型轉(zhuǎn)換以后出現(xiàn)的問題,可以用typeof操作符轉(zhuǎn)一下:

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

結(jié)果如圖:

可以看到類型轉(zhuǎn)換的問題基本解決,但對象部分基本都被去除了,因為他們和字符串相加時還是會發(fā)生轉(zhuǎn)化,解決的方案是把上面的str換成str = typeof arr[i] + JSON.stringify(arr[i]),相加之前先簡單序列化一下。

結(jié)果如圖:

從以上可以看出該階段的各種方法或多或少的都有一些問題,該去除的沒去掉,比如NaN。不該去的給去掉了,比如,形式相同但內(nèi)存地址不同的對象(是否應該去掉全看你怎么定義)。

ES5階段
function unique_es5(arr) {
    return arr.filter(function(ele,index,array) {
      return array.indexOf(ele) == index;
    })
}

結(jié)果如圖:

可以看到除了NaN,其他表現(xiàn)都是正常的。其中indexOf對于NaN總是返回-1,所以導致誤判。

ES6階段
let unique_includes = (arr) => {
    let newArr = [];
    arr.forEach(function(item){
        if(!newArr.includes(item)){
            newArr.push(item);
        }
    });
    return newArr;
}

結(jié)果如圖:

可以看到結(jié)果是符合預期的,es6中數(shù)組的擴展方法includes解決了用indexOf的弊端(不夠直觀,結(jié)果還要和索引進行比較。對NaN的誤判)。

let unique_set = (arr) => {
    return [...new Set(arr)];
}

結(jié)果和includes方法一樣,此處利用es6新增數(shù)據(jù)結(jié)構(gòu)set的特性,達到去重的目的。

let unique_map = (arr) => {
    let ret = [],
        m = new Map();
    for(val of arr) {
      if(!m.get(val)) {
        m.set(val , true);
        ret.push(val);
      }
    }
    return ret;
}

結(jié)果和includes一樣:

此處利用es6新增數(shù)據(jù)結(jié)構(gòu)map的特性,之前的鍵值對集合(js對象),只能用字符串當作健,map這種數(shù)據(jù)結(jié)構(gòu)打破了這一限制,各種類型的值都可以當作健,而且map的健是跟內(nèi)存地址綁定的,只要內(nèi)存地址不同就認為是不同的健,解決了之前形式相同而內(nèi)存地址不同被去掉的問題。對于簡單數(shù)據(jù)類型,只要嚴格相等就認為是相同的健,特例NaN也認為是相同的健。所以就解決了之前的兩個大難題。

總結(jié)

雖然只是一個簡單的去重問題,但這一路實踐下來,可以看到js越來越強大,功能也越來越完善,同時也越來越優(yōu)雅。現(xiàn)在再聽到有人說,js只是處理簡單表單驗證的玩具車語言之類的云云,我想我也會忍不住在他耳邊懟一句:那他媽是從前。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87231.html

相關(guān)文章

  • js基本操作-數(shù)組去重

    摘要:基本操作數(shù)組去重寫在前面數(shù)組去重經(jīng)常出現(xiàn)在前端招聘的筆試題里,比如有數(shù)組,請用實現(xiàn)去重函數(shù),使得返回作為筆試題,考點有二正確。基本介紹文章主要是對數(shù)組去重的常用方法進行介紹。 js基本操作-數(shù)組去重 寫在前面 JavaScript 數(shù)組去重經(jīng)常出現(xiàn)在前端招聘的筆試題里,比如: 有數(shù)組 var arr = [a, b, c, 1, 0, c, 1, , 1, 0],請用 JavaScr...

    blastz 評論0 收藏0
  • JS程序

    摘要:設計模式是以面向?qū)ο缶幊虨榛A的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設計模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學習總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

    melody_lql 評論0 收藏0
  • 案例 - 收藏集 - 掘金

    摘要:同行這么做使用實現(xiàn)圓形進度條前端掘金在開發(fā)微信小程序的時候,遇到圓形進度條的需求。實現(xiàn)也談數(shù)組去重前端掘金的數(shù)組去重是一個老生常談的話題了。百度前端技術(shù)學院自定義前端掘金一標簽概念元素表示用戶界面中項目的標題。 閑話圖片上傳 - 掘金作者:孫輝,美團金融前端團隊成員。15年畢業(yè)加入美團,相信技術(shù),更相信技術(shù)只是大千世界里知識的一種,個人博客: https://sunyuhui.com ...

    張金寶 評論0 收藏0
  • 案例 - 收藏集 - 掘金

    摘要:同行這么做使用實現(xiàn)圓形進度條前端掘金在開發(fā)微信小程序的時候,遇到圓形進度條的需求。實現(xiàn)也談數(shù)組去重前端掘金的數(shù)組去重是一個老生常談的話題了。百度前端技術(shù)學院自定義前端掘金一標簽概念元素表示用戶界面中項目的標題。 閑話圖片上傳 - 掘金作者:孫輝,美團金融前端團隊成員。15年畢業(yè)加入美團,相信技術(shù),更相信技術(shù)只是大千世界里知識的一種,個人博客: https://sunyuhui.com ...

    huangjinnan 評論0 收藏0
  • JS數(shù)組去重總結(jié)

    摘要:數(shù)組去重,一般會在面試的時候才會碰到,要求手寫數(shù)組去重方法的代碼。在實際項目中碰到的數(shù)組去重,一般都是后臺去處理,很少讓前端處理數(shù)組去重。數(shù)組去重的方法一利用去重中最常用如果不考慮兼容性,這種去重的方法代碼最少。 數(shù)組去重,一般會在面試的時候才會碰到,要求手寫數(shù)組去重方法的代碼。如果是被提問到,數(shù)組去重的方法有哪些?你能答出其中的10種,面試官很有可能對你刮目相看。 在實際項目中碰到的...

    whinc 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<