成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS數(shù)組去重

ymyang / 3397人閱讀

摘要:這種方式比使用的一般姿勢(shì)要快,比使用表的最快姿勢(shì)要慢,但是占用內(nèi)存要少主要內(nèi)容來自數(shù)組去重的正確編寫姿勢(shì)

不賣關(guān)子,直入主題

數(shù)組去重,最先想到的便是依次遍歷數(shù)組,在已遍歷的元素中查找是否存在當(dāng)前數(shù)組元素,重點(diǎn)是用什么存放已遍歷的數(shù)組,以及如何區(qū)分當(dāng)前元素是否已存在

由于下面會(huì)用到indexOf()的方法,它是ES5語法,低版本會(huì)存在兼容,先應(yīng)添加對(duì)應(yīng)的polyfill

Array.prototype.indexOf = Array.prototype.indexOf || function (searchElement, fromIndex) {
    var index = -1;
    fromIndex = fromIndex * 1 || 0;
    for (var k = 0, length = this.length; k < length; k++) {
        if (k >= fromIndex && this[k] === searchElement) {
            index = k;
            break;
        }
    }
    return index;
};

1.數(shù)組存放,indexOf()判斷

遍歷數(shù)組,建立新數(shù)組,利用indexOf判斷是否存在于新數(shù)組中,不存在則push到新數(shù)組,最后返回新數(shù)組

Array.prototype.unique = function() {
    var n = []; // 存放已遍歷的滿足條件的元素
    for (var i = 0; i < this.length; i++) {
        // indexOf()判斷當(dāng)前元素是否已存在
        if (n.indexOf(this[i]) == -1) n.push(this[i]);
    }
    return n;
}

下面是一個(gè)思想基本相同的變相版本

Array.prototype.unique = function() {
    // 創(chuàng)建一個(gè)新的臨時(shí)數(shù)組,并且把當(dāng)前數(shù)組的第一元素存入到數(shù)組中
    var n = [this[0]]; 
    // 從第二項(xiàng)開始遍歷
    for (var i = 1; i < this.length; i++) 
    {
        // 如果當(dāng)前數(shù)組的第i項(xiàng)在當(dāng)前數(shù)組中第一次出現(xiàn)的位置不是i,那么表示第i項(xiàng)是重復(fù)的,忽略掉,否則存入結(jié)果數(shù)組
        if (this.indexOf(this[i]) == i) n.push(this[i]);
    }
    return n;
}

JS引擎在實(shí)現(xiàn)indexOf()的時(shí)候會(huì)遍歷數(shù)組直到找到目標(biāo)為止,此函數(shù)會(huì)浪費(fèi)掉很多時(shí)間。所有這兩種方式都不是最優(yōu)的解決方式

// es5簡(jiǎn)化版
Array.prototype.unique = function() {
    return this.filter((v, i) => this.indexOf(v) === i)
}
// es6簡(jiǎn)化版
Array.prototype.unique = function() {
    return Array.from(new Set(this));
}
// 或
Array.prototype.unique = function() {
    return [...new Set(this)];
}

2.對(duì)象存放,哈希算法(映射)判斷

Array.prototype.unique = function() {
    // n為hash表,r為臨時(shí)數(shù)組
    var n = {}, r = [];
    for (var i = 0; i < this.length; i++) {
        // 如果hash表中沒有當(dāng)前項(xiàng)
        if (!n[this[i]]) {
            // 存入hash表
            n[this[i]] = true;
            // 把當(dāng)前數(shù)組的當(dāng)前項(xiàng)push到臨時(shí)數(shù)組里面
            r.push(this[i]); 
        }
    }
    return r;
}

但從耗時(shí)的角度來講,這是最優(yōu)的一種解決方式。但是從內(nèi)存占用角度來說,這并不是最優(yōu)的,因?yàn)槎嗔艘粋€(gè)hash表。這就是所謂的空間換時(shí)間

3.先排序,后比較

這種方式最大的優(yōu)勢(shì)就是排序后的比較次數(shù)變少,但是排序的過程也有性能消耗,應(yīng)權(quán)衡使用

Array.prototype.unique = function() {
    this.sort();
    var re = [this[0]];
    for (var i = 1; i < this.length; i++) {
        if (this[i] !== re[re.length - 1]) {
            re.push(this[i]);
        }
    }
    return re;
}

這個(gè)方法的思路是先把數(shù)組排序,然后比較相鄰的兩個(gè)值。排序的時(shí)候用的JS原生的sort()方法,JS引擎內(nèi)部應(yīng)該是用的快速排序吧。這種方式比使用indexOf()的一般姿勢(shì)要快,比使用hash表的最快姿勢(shì)要慢,但是占用內(nèi)存要少

主要內(nèi)容來自:數(shù)組去重的正確編寫姿勢(shì)

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84823.html

相關(guān)文章

  • JS數(shù)組去重總結(jié)

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

    whinc 評(píng)論0 收藏0
  • JS數(shù)組去重方法小結(jié)

    摘要:數(shù)組去重看了網(wǎng)上很多數(shù)組去重方法,用的比較常見的大概就幾種,今天想自己來做一個(gè)總結(jié)。還有就是方法返回的數(shù)組也是排序后的數(shù)組,某些情況下可能不符合要求。 JS數(shù)組去重 看了網(wǎng)上很多數(shù)組去重方法,用的比較常見的大概就幾種,今天想自己來做一個(gè)總結(jié)。部分內(nèi)容參考該博客 1 . 在原數(shù)組上操作(基本方法) 思路:利用循環(huán)嵌套,判斷數(shù)組中每個(gè)元素與其后面的元素是否相等,如果相等,就使用spli...

    PascalXie 評(píng)論0 收藏0
  • js基本操作-數(shù)組去重

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

    blastz 評(píng)論0 收藏0
  • js基本操作-數(shù)組去重

    摘要:基本操作數(shù)組去重?cái)?shù)組去重的方法臨時(shí)數(shù)組保存其實(shí)這里面還沒考慮到數(shù)組里面嵌套數(shù)組對(duì)象的情況把去重后的結(jié)果放在一個(gè)臨時(shí)數(shù)組中對(duì)原來數(shù)組的元素與臨時(shí)數(shù)組元素比較臨時(shí)數(shù)組中不存在這個(gè)元素的放入臨時(shí)數(shù)組。 js基本操作-數(shù)組去重 數(shù)組去重的方法 1. 臨時(shí)數(shù)組保存(其實(shí)這里面還沒考慮到數(shù)組里面嵌套數(shù)組/對(duì)象的情況) 把去重后的結(jié)果放在一個(gè)臨時(shí)數(shù)組中, 對(duì)原來數(shù)組的元素與臨時(shí)數(shù)組元素比較, 臨時(shí)...

    GeekGhc 評(píng)論0 收藏0
  • js數(shù)組去重方法總結(jié)

    摘要:注方法可以返回某個(gè)指定字符串在字符串中首次出現(xiàn)的位置比如首次出現(xiàn)的位置是數(shù)組中的第一個(gè),即下標(biāo)為遍歷數(shù)組使用標(biāo)識(shí)符去重聲明一個(gè)變量標(biāo)識(shí)排序后遍歷過濾數(shù)組思路先給數(shù)組排序,這樣相同的項(xiàng)總是相鄰。 假設(shè)我們有數(shù)組arr,并且聲明新數(shù)組hash用來存放去重后的元素: var arr = [23,44,5,2,23,5,1,7,8,7]; //包含重復(fù)元素 var hash= [];...

    snowLu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

ymyang

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<