js 數(shù)組去重

方法一 For嵌套for 使用splice去重更改原數(shù)組 正向遍歷循環(huán)

遇到刪掉 原數(shù)組遞減1

{
    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
    function distinct (arr) {
        for(let i = 0; i < arr.length; i++) {
            for(let j = i + 1; j < arr.length ; j++) {
                if(arr[i] === arr[j]) {
                    arr.splice(j, 1)
                    j--;
                }
            }
        }
    } 
    
    distinct(arr)
    console.log(arr) // [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]
}

優(yōu)點(diǎn):該方法可以顧慮到重復(fù)的 String、Boolean砖茸、 Number、undefined、null试幽,返回的是去重后的原數(shù)組。
缺點(diǎn):不能過濾掉 NaN卦碾、Object

方法二 For嵌套for 使用splice去重更改原數(shù)組 逆向遍歷循環(huán)

逆向循環(huán)遍歷 遇到重復(fù)的直接刪掉

{
    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
    function distinct (arr) {
        for(let i = arr.length; i > 0; i--) {
            for(let j = i - 1; j > -1 ; j--) {
                if(arr[i] === arr[j]) {
                    console.log(arr[j])
                    arr.splice(j, 1)
                }
            }
        }
    } 
    
    distinct(arr)
    console.log(arr) // [1, "true", true, 15, false, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]
}

優(yōu)缺點(diǎn)同方法一:

優(yōu)點(diǎn):該方法可以顧慮到重復(fù)的 String铺坞、Boolean起宽、 Number、undefined济榨、`null``坯沪,返回的是去重后的原數(shù)組。
缺點(diǎn):不能過濾掉 NaN腿短、Object

方法三:includes去重 返回新數(shù)組

{
    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
    function distinct (arr) {
        let newArr = []
        for(let i = 0; i < arr.length; i++) {
            if(!newArr.includes(arr[i])) {
                newArr.push(arr[i])
            } 
        }
        return newArr
    }
    
    console.log(distinct(arr)) // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
}

優(yōu)點(diǎn)是可以過濾重復(fù)的NaN了屏箍,但是返回的是個新數(shù)組,對比方法一二橘忱,該方法多消耗了一些存儲空間赴魁。

優(yōu)點(diǎn):該方法可以顧慮到重復(fù)的 String、Boolean钝诚、 Number颖御、undefined、null凝颇、NaN潘拱,返回的是去重后的新數(shù)組。
缺點(diǎn):不能過濾掉 Object

方法四 indexOf去重 返回新數(shù)組

{
    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
    function distinct (arr) {
        let newArr = []
        for(let i = 0; i < arr.length; i++) {
            if(newArr.indexOf(arr[i]) < 0) {
                newArr.push(arr[i])
            } 
        }
        return newArr
    }
    
    console.log(distinct(arr)) //  [1, "true", true, 15, false, undefined, null, NaN, NaN, "NaN", 0, "a", {…}, {…}]
}

該方法類比includes拧略,不能過濾掉NaN芦岂。

優(yōu)點(diǎn):該方法可以顧慮到重復(fù)的 String、Boolean垫蛆、 Number禽最、undefined、null袱饭,返回的是去重后的新數(shù)組川无。
缺點(diǎn):不能過濾掉 NaN、Object

方法五 利用對象的屬性key唯一的特性去重

{
    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
    function distinct(arr) {
        let obj = {}
        let newArr = []
        for(let i = 0; i < arr.length; i++) {
            if(!obj[arr[i]]){
                obj[arr[i]] = 1
                newArr.push(arr[i])
            }
        }
        return newArr
    }

    console.log(distinct(arr)) // [1, "true", 15, false, undefined, null, NaN, 0, "a", {…}]
}

該方法不禁可以過濾掉重復(fù)的NaN,還是可以過濾掉Object虑乖。

優(yōu)點(diǎn):該方法可以顧慮到重復(fù)的 String懦趋、Boolean、 Number疹味、undefined仅叫、null、NaN佛猛、Object惑芭,返回的是去重后的原數(shù)組。
缺點(diǎn):針對 NaN和'NaN', 對象的key會視為一個key继找,區(qū)分不了NaN和'NaN'遂跟。

方法六 利用ES6的Set數(shù)據(jù)結(jié)構(gòu)的特性

Set集合里的所有的元素都是唯一的

{
    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
    function distinct(arr) {
        return Array.from(new Set(arr))
    }

    console.log(distinct(arr)) // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
}

優(yōu)點(diǎn):該方法可以顧慮到重復(fù)的 String、Boolean、 Number幻锁、undefined凯亮、null、NaN哄尔,返回的是去重后的新數(shù)組假消。
缺點(diǎn):不能過濾重復(fù)的Object。

方法七 利用ES6的Map數(shù)據(jù)結(jié)構(gòu)的特性去重

{
    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
    function distinct(arr) {
        let map = new Map()
        let newArr = []
        for(let i = 0; i < arr.length; i++) {
            if(!map.has(arr[i])) {
                map.set(arr[i])
                newArr.push(arr[i])
            }
        }
        return newArr
    }

    console.log(distinct(arr)) // [1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]
}

優(yōu)點(diǎn):該方法可以顧慮到重復(fù)的 String岭接、Boolean富拗、 Number、undefined鸣戴、null啃沪、NaN,返回的是去重后的新數(shù)組窄锅。
缺點(diǎn):不能過濾重復(fù)的Object创千。

方法八 利用sort()去重

{
    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
    function distinct(arr) {
        let sortArr = arr.sort()
        let newArr = []
        for(let i = 1; i < sortArr.length; i++) {
            if(sortArr[i] !== sortArr[i-1]) {
                newArr.push(arr[i])
            }
        }
        return newArr
    }

    console.log(distinct(arr)) // [1, 15, NaN, NaN, "NaN", {…}, {…}, "a", false, null, "true", true, undefined]
}

該方法的缺陷很明顯,針對'true','true',true,true,undefined,undefined, null,null入偷,NaN, NaN,0, 0,{},{} 都不能很好的過濾去重追驴,不建議使用該方法去重。

方法九 reduce數(shù)組去重

{
    let arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN','NaN', 0, 0, 'a', 'a',{},{}];
    function distinct(arr) {
        return arr.sort().reduce((init, current) => {
            if(init.length === 0 || init[init.length-1] !== current) {
                init.push(current);
            }
            return init;
        }, []);
    }

    console.log(distinct(arr)) // [0, 1, 15, NaN, NaN, "NaN", {…}, {…}, "a", false, null, "true", true, undefined]
}

該方法先對數(shù)組進(jìn)行排序疏之,在進(jìn)行去重過濾殿雪,針對不能過濾重復(fù)的 NaN和Object。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锋爪,一起剝皮案震驚了整個濱河市冠摄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌几缭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沃呢,死亡現(xiàn)場離奇詭異年栓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)薄霜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門某抓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惰瓜,你說我怎么就攤上這事否副。” “怎么了崎坊?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵备禀,是天一觀的道長。 經(jīng)常有香客問我,道長曲尸,這世上最難降的妖魔是什么赋续? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮另患,結(jié)果婚禮上纽乱,老公的妹妹穿的比我還像新娘。我一直安慰自己昆箕,他們只是感情好鸦列,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹏倘,像睡著了一般薯嗤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上第股,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天应民,我揣著相機(jī)與錄音,去河邊找鬼夕吻。 笑死诲锹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涉馅。 我是一名探鬼主播归园,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稚矿!你這毒婦竟也來了庸诱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤晤揣,失蹤者是張志新(化名)和其女友劉穎桥爽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昧识,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钠四,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了跪楞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缀去。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甸祭,靈堂內(nèi)的尸體忽然破棺而出缕碎,到底是詐尸還是另有隱情,我是刑警寧澤池户,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布咏雌,位于F島的核電站凡怎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏处嫌。R本人自食惡果不足惜栅贴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望熏迹。 院中可真熱鬧檐薯,春花似錦、人聲如沸注暗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捆昏。三九已至赚楚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骗卜,已是汗流浹背宠页。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寇仓,地道東北人举户。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像遍烦,于是被迫代替她去往敵國和親俭嘁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354